我正在使用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
正如我在许多帖子中读到的那样,它说我们不能在类别中包含实例变量。所以上面的代码不应该工作。但是当我试一试时,一切都很好。
是否有任何与类别有关的变化或者只是运气?
答案 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/