do category允许在其实现中添加实例变量?

时间:2013-03-07 07:03:48

标签: objective-c io xcode4.5

我正在使用xcode 4.5.2

工作ios6.0 sdk

以下是我用于实现类别的代码

·H

@interface NSObject (busyMode)  
@property (nonatomic,assign) BOOL busy;
@end

的.m

@implementation NSObject (busyMode)
BOOL _bsy;

-(BOOL)busy{
    return _bsy;
}

-(void)setBusy:(BOOL)busy
{
    _bsy = busy;
}
@end

正如我在许多帖子中读到的那样,它说我们不能在类别中包含实例变量。所以上面的代码不应该工作。但是当我试一试时,一切都很好。

是否有任何与类别有关的变化或者只是运气?

4 个答案:

答案 0 :(得分:2)

正如其他人所指出的那样,你没有添加一个实例变量,而是一个全局变量,它将在你的所有实例之间共享。

类别无法添加实例变量。但是,如果您对objc_setAssociatedObject()objc_getAssociatedObject()完全需要它们,则可以模拟实例变量。

答案 1 :(得分:1)

那是因为你定义了一个全局变量,它不是一个实例变量。

尝试并实例化此对象的两个实例,您将观察到每个实例都不能保存不同的值。

答案 2 :(得分:0)

您尚未添加iVar。您已经定义了一个全局变量_bsy,并且正在getter / setter中为您的类别定义的属性访问它。

答案 3 :(得分:0)

我有一个宏,可以让你在类别中声明“属性”:

@implementation NSObject (AwesomeUtils)

JESynthesize(assign, NSInteger, index, setIndex);
JESynthesize(strong, NSString *, name, setName);
JESynthesize(copy, void(^)(void), completion, setCompletion);
JESynthesize(unsafe_unretained, id, unsafeObject, setUnsafeObject);
JESynthesize(weak, id<UITableViewDelegate>, delegate, setDelegate);
JESynthesize(strong, NSString *, readonlyID, changeReadonlyID);

// …
@end

我用引号说“属性”,因为即使没有@property声明也可以使用它们。该宏也可用于支持weak

您可以在此处检查实施(标题文件位于底部): http://nspicks.com/2013/12/15/cleaner-properties-implementation-in-categories/