我的initWithData:方法收到一个奇怪的警告:
TRDevice.h中的警告:不兼容的Objective-C types'struct NSDictionary *', 预期'struct NSData *'时 传递'initWithData:'的参数1 来自不同的Objective-C类型
:
@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:方法,所以我也没有覆盖它。我不知道为什么我会收到这个警告。
答案 0 :(得分:1)
+alloc
未返回NSObject
,它会返回id
。这是正确的声明。当从+ (id)alloc
返回时,类型(从编译器的角度来看)被删除。
initWithData:
的大多数用法都将NSData作为他们的第一个参数。这是objc“读得那么好”并且具有描述性的部分原因。
无论如何......就个人而言,我只是将其重命名为initWithDictionary:
,以保持清晰,惯例和避免警告。
另一种选择是简单地声明您的初始化程序包含类型:
- (id)initTRDeviceWithData:(NSDictionary *)data;
这是足够详细的,它不太可能与翻译中的其他类冲突。
或者您可以声明一个便利构造函数:
+ (TRDevice *)newTRDeviceWithData:(NSDictionary *)data;
或自动释放类型的变体:
+ (TRDevice *)trDeviceWithData:(NSDictionary *)data; // eww...