[英]Strange issue with readonly properties for iVars in iOS
这是我有的:
@interface engine : NSObject
{
int test;
}
@property (nonatomic, readonly) int test;
当我尝试在我自己的类(引擎类)中为iVar测试分配值(10)时,调试器显示test = 10和_test = 0。
当我尝试从测试中读取时,我得到0,我猜我得到了值of_test。
如何让它按照预期的方式工作? 我希望外部类只能读取“test”,但在我的课程中,我可以为“test”分配和读取值吗?
或者这个实现有什么问题?
更新:我没有同步,因为我使用xcode 4.4,它自动为你做。 我假设合成将使用相同的iVar名称作为属性。 如果进行正常的合成,这是默认行为。
谢谢。
很难说没有看到你的代码,但我猜,你正在尝试做一些像test=10
而不是self.test=10
。 根据您使用的ObjC / XCode的版本以及可能的@synthesize
语句,您正在访问(定义的)局部变量,但不访问属性resp。 这是iVar。
编辑
如果要编写只读属性,则应使用其iVar。 例如,后_test=10
既读访问, self.test
和_test
(但不是纯test
!)应该提供相同的值。
你认为是错的。 默认实现是使用下划线生成属性名称。 如果你想要一个不同的名字,你需要自己合成它。
自动合成创建带有下划线前缀的实例变量,因此名为test
的属性会生成_test
的后备实例变量。 所以你有两个实例变量; test
,没有连接到属性, _test
。 如果您写入实例变量test
,它将不会反映在_test
或属性的值中。
但更重要的是,自己声明支持实例变量毫无意义。 这只是一个额外的代码和不必要的冗余。 @property
行已包含类型,名称,是读/写还是只读以及存储限定符。 只需跳过自己声明支持实例变量并使用编译器为您生成的变量。
在Engine.h中:
@interface Engine : NSObject
@property (readonly, assign) NSInteger test;
- (void)doSomething;
@end
在Engine.m中:
@implementation Engine
- (void)doSomething {
_test++; // _test is created automatically by the compiler
}
@end
在other.m:
Engine *engine = [[Engine alloc] init];
NSLog(@"%d", engine.test); // 0
[engine doSomething];
NSLog(@"%d", engine.test); // 1
一切正常。 不要添加它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.