1

我正在使用 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

4 回答 4

2

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

类别不能添加实例变量。但是,如果您绝对需要使用objc_setAssociatedObject()和,您可以模拟实例变量objc_getAssociatedObject()

于 2013-03-07T09:09:40.170 回答
1

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

尝试实例化这个对象的两个实例,你会发现每个实例不能保存不同的值。

于 2013-03-07T07:30:14.540 回答
0

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

于 2013-03-07T07:29:33.450 回答
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/

于 2014-02-12T06:42:03.023 回答