2012-01-11 67 views
175

在我的iOS5的應用程序,我有NSObjectStates類,並試圖初始化它:接收例如消息類型***是一個向前聲明

states = [states init]; 

這裏是init方法States

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

    return self; 
} 

但有錯誤的行states = [states init];

接收器類型「狀態」例如消息是正向聲明

這是什麼意思?我究竟做錯了什麼?

+0

我試着去解決同樣的問題,但是每個tham都有不同的解決方案。我很困惑 – SentineL 2012-01-11 06:45:07

+1

很簡短的答案是你要麼缺少一個#import(也許在你的前綴文件中),或者你錯過了「@class Abc;」行(即在@接口行上方的.h文件中) – Fattie 2014-03-02 09:17:44

回答

393

這基本上意味着您需要導入包含狀態聲明的.h文件。

但是,有一個很多其他東西你的代碼錯了。

  • 您正在啓動一個沒有+alloc的對象。這是行不通的
  • 你聲明一個對象作爲非指針類型,這是行不通的任何
  • 你不能調用-init[super init]
  • 您已經在標題中聲明瞭使用@class的類,但從未導入該類。
+0

這有點奇怪,因爲在我的情況下,由於循環引用問題,我只刪除了'.h'文件。 – Alper 2017-11-16 10:49:50

1

確保單元方法的原型在.h文件中。

由於您在文件中調用的方法高於定義它的方法,因此您會收到此消息。或者,您可以重新排列方法,以便調用者在文件中比調用的方法更低。

5

您正在使用

States states; 

哪裏,你應該使用

States *states; 

你的init方法應該是這樣的

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

現在終於當你要創建國家班的對象,你應該這樣做。

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

我不是說這是做這件事的最好方法。但它可以幫助你理解初始化對象的基本用法。

23

當我有兩個依賴於對方的文件時,我得到了這樣的消息。這裏棘手的事情是,如果您只是嘗試從頭文件中導入對方(A類輸入B類,B類輸入A類),則會得到循環引用。所以你要做的是將一個轉發(@class A)聲明放在其中一個類的(B類)頭文件中。然而,當試圖在B類的實現中使用A級ivar時,出現這種錯誤,僅在B類的.m文件中添加#import "A.h"就解決了我的問題。

0

有兩個相關的錯誤消息可能會告訴您聲明和/或導入有問題。

第一個是你指的那個,它可以通過在你的.h(或.pch文件)中放入一個#import來生成,同時在你的.h中聲明一個@class。

你可能會看到,如果你有在你的國家類的方法等。第二:添加#進口後

- (void)logout:(NSTimer *)timer 

是這樣的:

爲「國」無可見@interface聲明選擇「註銷:」

如果你看到這一點,你需要在課堂上找你的.h文件來檢查,看看您是否宣佈你的「註銷」的方法(在這種情況下) e導入或轉發。在國類的.H

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

使這些相關的錯誤消失的一個或兩個:

所以你的情況,你需要一個。

27

FWIW,我在將核心數據實現到現有項目時出現此錯誤。事實證明,我忘了將CoreData.h鏈接到我的項目。我已經添加了CoreData框架,以我的項目,但通過鏈接到就像蘋果的模板,我的預編譯頭的框架解決的問題做:

#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

幾乎所有的CoreData教程都開始使用模板而不是現有的項目,這真是令人遺憾。在這裏犯錯很容易。 – Yeung 2013-10-15 09:04:29

3

檢查,如果你導入了扔類的頭文件這個錯誤。

11

對我來說,我使用了@class 「Myclass.h」

當我改爲#IMPORT 「Myclass.h」

它工作得很好。

相關問題