即使由静态变量支持的属性,类也会获得唯一的属性支持

时间:2015-11-20 16:41:06

标签: objective-c

似乎该属性只是没有得到静态变量的支持,并且编译器给它一个唯一的,无论如何。

头文件:

@interface MyBase : NSObject
@property int error;
@end

@interface MySubclass : MyBase
@end

实施档案:

static int staticError = 0;

@implementation MyBase
@synthesize error = staticError;            // back it with a static variable
@end

@implementation MySubclass
@end

示例:

MyBase* base = [[MyBase alloc] init];
base.error = 1;

MyBase* anotherBase = [[MyBase alloc] init];
NSAssert( base.error == anotherBase.error , @"This causes assertion" );

MySubclass* subClass = [[MySubclass alloc] init];
subClass.error = 2; // This *should* set our static variable from 1 to 2.

// Prove they refer to the same static variable (but fail)
NSAssert( base.error == subClass.error , @"This causes assertion" );

在Xcode 6.4上测试

2 个答案:

答案 0 :(得分:1)

首先:@property声明,只有声明一个(readonly集)或两个实例 方法。实际上,它没有定义实例变量或任何其他类型的变量。

没有理由为全局变量提供实例方法。这样的全局变量实际上不是财产。属性是什么?

如果您想拥有这样的全局存储,可以添加方法来访问它或只是函数。 (使用类方法获得的唯一好处是能够在子类中覆盖它,这类似于无意义。)

static int staticError = 0; // int? really int? staticError? Really staticError?

+ (int)error { return staticError; }
+ (void)setError:(int)error { staticError = error; }

或者

int baseError { return staticError; }
void setBaseError(int error) { staticError = error; }

答案 1 :(得分:0)

@synthsize error = staticError;行没有按照您的想法行事。

它将使用(并在需要时创建)名为staticError实例变量。这与名为staticError的静态变量完全不同。

如果你真的(以及为什么?)想要使用静态变量作为属性的后备存储,那么删除@synthesize行并为属性添加自己的显式setter和getter方法。它们的实现应该使用静态变量。