[英]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.