2011-04-27 45 views
0

我得到一個奇怪的警告與我initWithData:方法:initWithData:預計結構的NSData *警告

警告:不兼容的Objective-C 型 '結構的NSDictionary *', 預期 '結構的NSData *' 時 傳遞參數1 'initWithData:' 從不同目標C型

在TRDevice.h:

@interface TRDevice : NSObject 
{ 
    NSString *name;  
} 

@property (nonatomic, copy) NSString *name; 

-(id)initWithData:(NSDictionary *)inData; 

@end 

在TRDevice.m:

- (id)initWithData:(NSDictionary *)inData 
{ 
    if ((self = [super init])) 
    { 
     self.name = [inData valueForKey:TRDeviceNameKey]; 
    } 
    return self; 
} 

而且在那裏我嘗試實例上述目的:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSArray *dataArray = [prefs arrayForKey:TRDevicesKey]; 
for (NSDictionary *data in dataArray) 
{ 
    TRDevice *device = [[TRDevice alloc] initWithData:data]; 
    [self.devices addObject:device]; 
    [device release]; 
} 

此警告消失,如果我1)重命名init方法到別的東西等作爲initWithDictionary: 。或2)如果我通過nilinitWithData:

AFAIK NSObject不實現initWithData:方法,所以我也不會覆蓋它。我不知道爲什麼我得到這個警告。

回答

1

+alloc不返回NSObject,它返回id。這是正確的聲明。該類型是(從編譯器的角度來看)當它通過+ (id)alloc返回時被擦除。

initWithData:的大部分用途都以NSData作爲他們的第一個參數。這是objc'讀得很好'並且是描述性的部分原因。

反正......個人而言,我只是爲了清晰,慣例將它重命名爲initWithDictionary:,並避免了警告。

另一種選擇是簡單地宣佈你的初始化包括類型:

- (id)initTRDeviceWithData:(NSDictionary *)data; 

,這是不夠詳細,這是不太可能在翻譯其他類衝突。

,或者你可以聲明一個便捷構造:

+ (TRDevice *)newTRDeviceWithData:(NSDictionary *)data; 

或變體爲自動釋放類型:

+ (TRDevice *)trDeviceWithData:(NSDictionary *)data; // eww...