我的 initWithData: 方法收到一个奇怪的警告:
warning: incompatible Objective-C types 'struct NSDictionary *', expected 'struct NSData *' when passing argument 1 of 'initWithData:' from distinct Objective-C type
在 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:
。
据我所知 NSObject 没有实现 initWithData: 方法,所以我也不会覆盖它。我不知道为什么会收到此警告。
最佳答案
+alloc
不返回 NSObject
,它返回 id
。这是正确的声明。当通过 + (id)alloc 返回时,类型(从编译器的角度)被删除。
大多数使用initWithData:
都将NSData作为第一个参数。这是 objc “读起来如此好”并且具有描述性的部分原因。
无论如何...就我个人而言,为了清晰、约定并避免警告,我只是将其重命名为 initWithDictionary:
。
另一种选择是简单地声明初始化程序以包含类型:
- (id)initTRDeviceWithData:(NSDictionary *)data;
这足够详细,不太可能与翻译中的其他类发生冲突。
或者您可以声明一个便利构造函数:
+ (TRDevice *)newTRDeviceWithData:(NSDictionary *)data;
或者自动释放类型的变体:
+ (TRDevice *)trDeviceWithData:(NSDictionary *)data; // eww...
关于objective-c - 初始化与数据 : expected struct NSData * warning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5803198/