1

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

@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

现在,作为一个偏好问题,我想将该图像属性与主接口声明分开,因为它不是来自 api 的东西。但是,当我以这种方式声明它时,当我调用 getter 方法时会得到一个无法识别的选择器。这是为什么?如果我将其移至主界面声明,则没有问题。

4

2 回答 2

6

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

于 2013-08-30T19:21:50.833 回答
-1

那很有意思。确实应该有警告。我猜这是因为属性的隐式合成,但不能对类别中声明的属性起作用。

无论如何,您可以保持头文件不变,但您必须在.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
于 2013-08-30T20:53:05.800 回答