2011-05-16 103 views
2

假設我有一堂課。我想通過以下方式來聲明一個屬性:只讀插座?

  1. 從應該只讀如果訪問編程類之外;
  2. 應該可以使用插座從Interface Builder中設置值;
  3. (從課堂內部應該是可寫的,但我知道該怎麼做)。

的「解決方案」,我想出了是寫一時間設定:

但這制定者仍然可以從代碼(雖然只有有效一次)被調用,所以它的不是一個解決方案。

另一種方法是,以紀念伊娃爲IBOutlet中,使財產readonly這樣的:

@interface MyClass : NSObject { 
    IBOutlet ClassA *a; 
} 
@property (readonly) ClassA *a; 
@end 

但根據this answer,這是一個可憐的風格,使得內存管理目前還不清楚。

任何想法?

回答

3

有人糾正我,如果我錯了,但我認爲 NIB加載機制僅在運行時實例化.nib文件時檢查setter方法。因此,這意味着你可以爲只讀聲明你的公共財產,但在你的.m文件寫了一個「私人」二傳手:

// MyClass.h 
@property (readonly, retain) IBOutlet ClassA *a; 

// MyClass.m 
@interface MyClass() 
@property (readwrite, retain) ClassA *a; 
@end 

@implementation MyClass 
@synthesize a; 
... 
@end 
+0

欲瞭解更多信息階級擴展參見[Objective-C的編程語言](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html%23//apple_ref/doc/uid/TP30001163-CH20-SW2)。 – ughoavgfhw 2011-05-16 21:56:35

+0

這是否應該表示nib加載代碼會執行類似if([obj respondsToSelector:@selector(setA :)])[obj setA:a]'?如果是這樣,儘管沒有公開聲明setter,該條件是否會評估爲「YES」? – adubr 2011-05-16 22:03:09

+0

第一個問題:我不確定,但我懷疑是的。第二個問題:肯定是的。 – 2011-05-17 00:00:05