2016-11-25 21 views
0

@interface,我有這樣的聲明:如何初始化init中的Objective C類變量?

@interface myClass { 
    NSDictionary * myData; 
} 

@property (nonatomic, assign) NSDictionary * data; 
+ (id) initWithData:(NSDictionary *)data; 

@end 

@implementation,我有這樣的代碼:

@implementation 

@synthesize data; 

+ (id) initWithData:(NSDictionary *)freshData { 
    self = [super init]; 
    if (self) { 
     self->data = freshData; 
    } 
    return self; 
} 

@end 

但我對self->data遇到錯誤Incomplete definition of type 'struct objc_class

如果更改成self.data,我得到錯誤Member reference type 'struct objc_class *' is a pointer; did you mean to use '->'?

如果我刪除self,我得到錯誤`實例變量「數據」中的方法訪問「。

但是,如果我將方法類型從+(類方法)更改爲-(實例方法),我無法訪問init。

而且我無法通過將作業從data更改爲myData來修復此錯誤。

我應該如何構造一個構造函數?

我從(但沒有幫助)學到的鏈接是:

回答

1

你能做到這樣也

+ (id) initWithData:(NSDictionary *)freshData { 
    return [[self alloc]initWithData:freshData]; 
} 
- (instancetype) initWithData:(NSDictionary *)freshData { 

    NSParameterAssert(freshData != nil); 

    self = [super init]; 

    if (self) { 
     self.data = freshData; 
    } 

    return self; 
} 
+0

如果我只實現' - (instancetype)initWithData:(NSDictionary *)freshData'沒有'+(id)initWithData:(NSDictionary *)freshData',那麼缺點是什麼? –

+0

那麼你也可以這樣做,如果創建該類的對象沒有任何問題,就像使用實例方法一樣,您需要創建該類的對象以使用該方法並使用類方法可以使用Class調用該方法。 – Rajat

+0

檢查這也適用於類方法vs實例方法 - http:// stackoverflow。com/questions/1053592 /類與實例方法之間的區別 – Rajat

1

不要使用公共init方法(+)

+ (id) initWithData:(NSDictionary *)data; 

更改爲

- (instancetype) initWithData:(NSDictionary *)data; 

,我強烈建議你使用instancetype代替idreference

2

在一般情況下,我不會期望的init*方法是一個類方法。一般來說,您有一個類名稱,如default*,shared**withDictionary:。因此,對於一個名爲myClass類,我希望看到這一點:

+ (myClass*)myClassWithDictionary:(NSDictionary*)dict 
{ 
    return [[myClass alloc] initWithDictionary:dict]; 
} 

這可能是重要的,當靜態分析器分析您的代碼,例如。命名在Objective-C中很重要,並且提示編譯器(和分析器)關於代碼的意圖是什麼。

+0

你的意思是像'[UIColor colorWithCGColor:]'? –

+0

是的,這就是我的意思。 – user1118321

+0

好吧,我想我知道我無法訪問實例init方法構造函數的錯誤...我忘記在'init'之前先執行'alloc'。這就是爲什麼我只有在將'init'改爲類構造函數時才能訪問'init'方法,因爲我立即寫了'[MyClass initWithData:]'。我很習慣Swift的簡單性,當我不得不回到Objective C時,我忘記了鑽取......然後你的回答提醒我爲什麼'init'必須是實例方法,而不是類方法。謝謝! –