簡體   English   中英

iOS中iVars的只讀屬性存在奇怪問題

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM