init找不到实例方法(返回类型默认为'id')

时间:2015-02-25 19:37:30

标签: ios objective-c cocoa

我正在使用以下签名创建init方法:

- (id)initWithDictionary:(NSDictionary *)dictionary AndLocation:(CLLocation *)location

但是收到此警告消息:

Instance method '-initWithDictionary:AndLocation:' not found (return type defaults to 'id')

但是,如果我在init方法中使用断点,我肯定会这样做:

  1. 警告的原因?
  2. 我该如何摆脱它?
  3. Fwiw,我已经重新启动了xcode,删除了派生数据,Build Clean等等。

    此方法签名不在.h文件中,但我非常确定那里不应存在init方法(例如Objective-C: Should init methods be declared in .h?)。

2 个答案:

答案 0 :(得分:1)

您需要将签名添加到.h文件中。 您误解了链接中的注释 - 如果您继承- (id) init,则不需要添加特定的NSObject方法,因为已经定义了init。

- (instancetype) initWithDictionary:(NSDictionary *)dictionary AndLocation:(CLLocation *)location;添加到标题

答案 1 :(得分:1)

您打算在实现文件之外使用的任何方法都必须在头文件中声明,否则您将收到警告(或错误)。这包括init...方法。

如果你真的不想在头文件中使用init...方法(虽然我不确定你为什么不这样做),你可以创建一个静态构造函数方法反而反映它。

@interface YourClass : YourSuperclass
+ (instancetype)createWithDictionary:(NSDictionary *)dictionary location:(CLLocation *)location;
@end

然后在您的实现文件中实现它:

@implementation YourClass
+ (instancetype)createWitDictionary:(NSDictionary *)dictionary location:(CLLocation *)location {
  return [[self alloc] initWithDictionary:dictionary location:location];
  // or for non-ARC:
  // return [[[self alloc] initWithDictionary:dictionary location:location] autorelease];
}
@end