调用类扩展中定义的方法时无法识别选择器



我有一个类,我在头文件中定义了一个类扩展名,如下所示:

@interface GCFriend : GCDataObject
@property (nonatomic, strong) NSString *firstName;
...
...
...    
+ (NSOperation *)getFriendsCached:(void (^)(NSArray *cached))cached
                            fresh:(void (^)(BOOL success, NSArray *fresh))fresh;    
@end
@interface GCFriend (Transient)
@property (nonatomic, strong) UIImage *image;
@end

现在,作为一个优先事项,我希望将image属性与主接口声明分开,因为它不是来自api的东西。然而,当我以这种方式声明它时,当我调用getter方法时,我会得到一个无法识别的选择器。为什么?如果我把它移到主接口声明中,就没有问题。

这不是类扩展。这是一个类别。类扩展名通常放在类的实现文件中,其形式为@interface GCFriend ()——空括号。您可以在类扩展中添加实例变量,但不能在类别中添加。(这是因为类扩展是作为类的一部分编译的,而类别是单独编译和加载的。)

这很有趣。真的应该有一个警告。我想这是因为属性的隐式合成,但这不能用于在类别中声明的属性。

无论如何,您可以保持头文件的原样,但必须在.m文件中显式地编码属性getter和setter。

...
@interface GCFriend() {
    UIImage *image; // create the ivar 
}
@end
@implementation GCFriend (Transient) 
- (UIImage *) image {  // getter
    return image ;
}
- (void) setImage:(UIImage *) img { // setter
    image = img ;
}
@end

最新更新