Objective c 类别是否允许在其实现中添加实例变量?
我正在使用ios6.0SDK和xcode 4.5.2 下面是我用来实现一个类别的代码 h m 正如我在许多帖子中读到的,它说我们不能在类别中包含实例变量。所以上面的代码不应该工作。但当我尝试时,一切都很好Objective c 类别是否允许在其实现中添加实例变量?,objective-c,io,xcode4.5,Objective C,Io,Xcode4.5,我正在使用ios6.0SDK和xcode 4.5.2 下面是我用来实现一个类别的代码 h m 正如我在许多帖子中读到的,它说我们不能在类别中包含实例变量。所以上面的代码不应该工作。但当我尝试时,一切都很好 是否有任何与类别相关的更改或只是运气而已???您没有添加iVar。您已经定义了一个全局变量\u bsy,并且正在类别定义的属性的getter/setter中访问它。这是因为您定义了一个全局变量,它不是实例变量 尝试并实例化此对象的两个实例,您会发现每个实例不能包含不同的值。正如其他人所指出的,
是否有任何与类别相关的更改或只是运气而已???您没有添加iVar。您已经定义了一个全局变量
\u bsy
,并且正在类别定义的属性的getter/setter中访问它。这是因为您定义了一个全局变量,它不是实例变量
尝试并实例化此对象的两个实例,您会发现每个实例不能包含不同的值。正如其他人所指出的,您没有添加实例变量,而是添加一个全局变量,该变量将在所有实例之间共享
类别无法添加实例变量。但是,如果绝对需要,您可以使用
objc\u setAssociatedObject()
和objc\u getAssociatedObject()
模拟实例变量。我有一个宏,允许您在如下类别中声明“属性”:
@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
@实现NSObject(AwesomeUtils)
jesynthesis(赋值、NSInteger、索引、setIndex);
jesynthesis(强,NSString*,name,setName);
综合(副本、作废(^)(作废)、完成、设置完成);
JesSynthesis(不安全的、未维护的、id的、未安全对象的、设置未安全对象的);
jesynthesis(弱、id、委托、setDelegate);
JEsynthesis(强、NSString*、readonlyID、changeReadonlyID);
// …
@结束
我用引号表示“properties”,因为即使没有@property
声明,您也可以使用它们。宏还支持弱
您可以在此处检查实现(头文件位于底部):
这不是一个实例变量。尝试使用NSObject的多个实例。您是对的,不适用于两个实例。;)
@implementation NSObject (busyMode)
BOOL _bsy;
-(BOOL)busy{
return _bsy;
}
-(void)setBusy:(BOOL)busy
{
_bsy = busy;
}
@end
@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