2011-04-27 52 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...