2012-01-11 18 views
175

Trong ứng dụng iOS5 tôi, tôi có NSObjectStates lớp, và cố gắng để init nó:loại máy thu *** cho thông điệp dụ là một tuyên bố mong

states = [states init]; 

đây là init phương pháp trong States:

- (id) init 
{ 
    if ((self = [super init])) 
    { 
     pickedGlasses = 0; 
    } 

    return self; 
} 

Nhưng có lỗi trong dòng states = [states init];

loại bộ thu "Hoa" cho thông báo mẫu là một tờ khai chuyển tiếp

Có nghĩa là gì? Tôi đang làm gì sai?

+0

Tôi cố gắng thực hiện cùng một câu hỏi, nhưng có giải pháp khác nhau trong mỗi tham. Tôi đang bối rối một chút – SentineL

+1

Câu trả lời rất ngắn là bạn đang thiếu một #import (có lẽ trong tệp Tiền tố của bạn) hoặc bạn đang thiếu một "@class Abc;" dòng (tức là trong một .h tập tin ngay trên dòng @interface) – Fattie

Trả lời

393

Điều đó về cơ bản có nghĩa là bạn cần phải nhập tệp .h có chứa khai báo của Hoa.

Tuy nhiên, có các nội dung khác sai với mã của bạn.

  • Bạn đang thực hiện một đối tượng mà không cần +alloc 'ing. Điều đó sẽ không hoạt động
  • Bạn tuyên bố một đối tượng dưới dạng loại không phải con trỏ, sẽ không hoạt động hoặc là
  • Bạn không gọi số [super init] trong -init.
  • Bạn đã khai báo lớp học bằng cách sử dụng @class trong tiêu đề, nhưng không bao giờ được nhập lớp.
+0

Đây là một chút lạ mặc dù kể từ trong trường hợp của tôi, tôi chỉ cần loại bỏ các tập tin '.h' vì một vấn đề tham chiếu vòng tròn. – Alper

1

Đảm bảo nguyên mẫu cho phương thức đơn vị của bạn nằm trong tệp .h.

Vì bạn đang gọi phương thức cao hơn trong tệp mà bạn định nghĩa nó, bạn nhận được thông báo này. Ngoài ra, bạn có thể sắp xếp lại các phương thức của mình để người gọi có ít tệp hơn so với các phương thức mà họ gọi.

5

Bạn đang sử dụng

States states; 

nơi như bạn nên sử dụng

States *states; 

phương pháp init của bạn nên được như thế này

-(id)init { 
    if((self = [super init])) { 
     pickedGlasses = 0; 
    } 
    return self; 
} 

Bây giờ cuối cùng khi bạn đang đi để tạo ra một đối tượng cho lớp học Hoa bạn nên làm như thế này.

State *states = [[States alloc] init]; 

Tôi không nói đây là cách tốt nhất để làm điều này. Nhưng nó có thể giúp bạn hiểu việc sử dụng cơ bản của việc khởi tạo các đối tượng.

23

Tôi nhận được loại thông báo này khi tôi có hai tệp phụ thuộc vào nhau. Điều khó khăn ở đây là bạn sẽ nhận được một tham chiếu vòng tròn nếu bạn chỉ cố gắng nhập lẫn nhau (lớp A nhập khẩu lớp B, lớp B nhập khẩu lớp A) từ các tệp tiêu đề của chúng. Vì vậy, những gì bạn sẽ làm thay vì đặt một tuyên bố về phía trước (@class A) trong một trong các tập tin tiêu đề của lớp (lớp B).Tuy nhiên, khi cố gắng sử dụng một ivar của lớp A trong việc thực hiện lớp B, lỗi này xuất hiện, chỉ cần thêm một #import "A.h" trong tệp .m của lớp B đã khắc phục sự cố cho tôi.

0

Có hai thông báo lỗi liên quan có thể cho bạn biết có điều gì đó sai với khai báo và/hoặc nhập.

Đầu tiên là tài liệu bạn đang đề cập, có thể được tạo bằng cách không đặt #import vào tệp .m (hoặc .pch) trong khi khai báo một lớp @ trong tệp .h của bạn.

Thứ hai bạn có thể thấy, nếu bạn đã có một phương pháp trong lớp Hoa của bạn như:

- (void)logout:(NSTimer *)timer 

sau khi thêm #import là thế này:

Không @ interface rõ ràng cho "Hoa" khai báo công cụ chọn 'đăng xuất:'

Nếu bạn thấy điều này, bạn cần kiểm tra xem liệu bạn đã khai báo phương thức "đăng xuất" (trong trường hợp này) trong tệp .h của lớp you'r e nhập hoặc chuyển tiếp.

Vì vậy, trong trường hợp của bạn, bạn sẽ cần một:

- (void)logout:(NSTimer *)timer; 

trong .h lớp Hoa của bạn để làm cho một hoặc cả hai của các lỗi liên quan đến biến mất.

27

FWIW, tôi gặp phải lỗi này khi tôi triển khai dữ liệu lõi trong một dự án hiện có. Hóa ra tôi quên liên kết CoreData.h với dự án của tôi. Tôi đã thêm vào khuôn khổ CoreData cho dự án của tôi, nhưng giải quyết vấn đề này bằng cách liên kết với các khuôn khổ trong phần đầu trước biên soạn của tôi giống như mẫu của Apple làm:

#import <Availability.h> 

#ifndef __IPHONE_5_0 
#warning "This project uses features only available in iOS SDK 5.0 and later." 
#endif 

#ifdef __OBJC__ 
    #import <UIKit/UIKit.h> 
    #import <Foundation/Foundation.h> 
    #import <CoreData/CoreData.h> 
#endif 
+2

Thật đáng tiếc khi hướng dẫn CoreData gần như bắt đầu với việc sử dụng mẫu nhưng không phải với một dự án hiện có. Rất dễ nhầm lẫn ở đây. – Yeung

3

Kiểm tra xem bạn nhập khẩu các tập tin tiêu đề của lớp học được ném lỗi này.

11

Đối với tôi, tôi đã được sử dụng @class "Myclass.h"

Khi tôi thay đổi để #import "Myclass.h"

nó làm việc tốt.