2009-11-13 30 views
1

通常情況下,當我們有一個界面元素鏈接到一個類的字段,我們使用關鍵字「IBOutlet中」通知預copiler:使用訪問器對IB元素實例有什麼優勢?

@interface MyController : NSObject { 
    IBOutlet NSWindow *theWindow; 
} 

,並在執行我們直接指針theWindow使用調用NSWindow類的方法!

但是,告訴預編譯器創建一些訪問器以訪問由「theWindow」指向的對象並通過訪問器管理對象有什麼優勢?

實施例:

@interface MyController : NSObject { 
    NSWindow *theWindow; 
} 
@property(retain) IBOutlet NSWindow *theWindow; 


@implementation MyController 

@synthesize theWindow; 

@end 

是否使用第二溶液的(對於所有指針接口的元素)減慢了應用程序的性能?

什麼時候使用第二種方法而不是第一種方法是一種好的做法?

謝謝!

回答

1

那麼一般來說,我不保留這些屬性,而且我甚至公開過Outlets的唯一方法就是如果某件事需要從外部訪問某個元素,並且這對於您的設計來說通常是一個不好的跡象。

我還沒有嘗試過,但我會試圖合成閱讀部分,我可能只會在原子訪問重要的地方使用它。 AppKit的某些部分並不總是線程安全的。

0

存取器所花費的時間是完全不可察覺的。即使你運行這個代碼數百萬次,所有的IB機器都會積極地把它淹沒。

如果這些變量只在那個時間設置,並且從不在類之外訪問,那麼訪問器可能是不必要的。

1

Bryan是正確的,你只需要公開UI元素屬性,如果需要從另一個實例或另一個類完全訪問它們。它通常是一個建築設計問題的標誌,但並非總是如此。

要回答的最後兩個問題:

是否使用第二液(所有指針接口的元素)減緩了應用程序的性能?

不是,添加一個名爲-doSomethingReallyComplicated的方法會降低應用程序的速度,如果永遠不會調用該方法。它可能會減慢啓動時產生的一堆未使用的代碼(從而使得二進制文件無緣無故地增大),並且肯定會減慢編譯時間,但它不會影響應用程序的運行時性能。

什麼時候使用第二種方法而不是第一種方法是一種好的做法?

正如Bryan所說,當您需要從該類的給定實例之外訪問它時,您將UI元素公開爲屬性(通過@synthesize或手動編碼的訪問器)。同樣,需要這樣做通常是設計問題的標誌。

0

當一個筆尖被解除存檔時,如果存在一個存取器來設置給定的插座,那麼unarchiver將使用它。如果沒有訪問者,那麼將直接使用Obj-C運行時函數來設置ivar,以便按名稱查找它。

訪問者將會更快,因爲您將避免通過運行時查找所有有問題的伊娃。話雖如此,除非你一遍又一遍地加載這個筆尖,否則差異可以忽略不計。

你想要一個插座的訪問器的主要原因與你想發佈的任何其他伊娃或財產相同。這是確保內存管理得到正確覆蓋的一種方便方法。

相關問題