initWithData:预期的struct NSData *警告

时间:2011-04-27 11:20:26

标签: objective-c cocoa-touch ios

我的initWithData:方法收到一个奇怪的警告:

  

警告:不兼容的Objective-C   types'struct NSDictionary *',   预期'struct NSData *'时   传递'initWithData:'的参数1   来自不同的Objective-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)如果我将nil传递给initWithData:

AFAIK NSObject没有实现initWithData:方法,所以我也没有覆盖它。我不知道为什么我会收到这个警告。

1 个答案:

答案 0 :(得分:1)

+alloc未返回NSObject,它会返回id。这是正确的声明。当从+ (id)alloc返回时,类型(从编译器的角度来看)被删除。

initWithData:的大多数用法都将NSData作为他们的第一个参数。这是objc“读得那么好”并且具有描述性的部分原因。

无论如何......就个人而言,我只是将其重命名为initWithDictionary:,以保持清晰,惯例和避免警告。

另一种选择是简单地声明您的初始化程序包含类型:

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

这是足够详细的,它不太可能与翻译中的其他类冲突。

或者您可以声明一个便利构造函数:

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

或自动释放类型的变体:

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