objective-c - 初始化与数据 : expected struct NSData * warning

标签 objective-c cocoa-touch ios

我的 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/

相关文章:

ios - [iOS]捕获用户位置: clarification

objective-c - Uncrustify:删除 ObjC 代码中的双及更多空行

iphone - 定义VS静态常量VSNSString——内存角度

IOS Storyboard将每个 subview 限制在屏幕底部

iphone - iOS6 自动旋转 - UIPageViewController

android - 增加超时以摆脱 Cordova/PhoneGap 应用程序中的 "The server is taking longer than expected to respond"

ios - 如何改变WKWebView中的文本选择颜色?

objective-c - NSDate 获取年/月/日

iphone - 如何在 UIAlertview 中添加 iAd?

ios - SkScene 更新方法被推送通知中断,如何检测中断