似乎该属性只是没有得到静态变量的支持,并且编译器给它一个唯一的,无论如何。
头文件:
@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上测试
答案 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方法。它们的实现应该使用静态变量。