2012-01-03 45 views
15

假設我有一個視圖控制器或窗口控制器,它是(像往常一樣)對應XIB文件中的「文件所有者」。實現中的IBOutlet實例變量(.m)文件

它是(衆所周知)在控制器類中有IBOutlet s很常見,然後可以使用Interface Builder在XIB中進行連接。

到現在爲止,我一直在我的界面(.h)文件中創建IBOutlet實例變量。但是(衆所周知)IBOutlet通常是控制器類的私有機制;外人甚至不應該知道他們。

這就是爲什麼我現在自Objective-C最近開始提供這樣做的能力 - 希望將我所有的IBOutlet都放到我​​的實現(.m)文件中。

我試過這樣做,這似乎工作正常。 我的問題是這些:爲什麼這個有效?我的印象是Interface Builder只能查看類的頭文件 - 而不是窺探他們的實現文件。我錯了嗎? Interface Builder如何「看到」實現文件?將IBOutlet實例變量放入實現文件可能會帶來潛在危險嗎?

+1

請注意,只有在Mac上使用現代運行時纔可能,這意味着只有64位。傳統的運行時需要在頭文件中聲明所有的ivars。 – 2012-01-03 22:31:44

回答

12

Xcode 4 User Guide

注:由於Xcode的4解析兩個頭文件和實施 文件建立索引,可以定義 實現(.M)文件的行動和出口,而不需要將它們放在標頭 文件,您可以直接從nib文件連接到 實施文件。因此,您不需要向可能正在使用您的課程的客戶公開您的界面或操作的部分內容。

而對於難道是潛在的危險把IBOutlet中的實例變量進入執行文件?

是的,但沒有那麼多,因爲在運行時缺乏訪問範圍,因此可以訪問任何已聲明的方法。即使該方法不可訪問,解析也是在運行時完成的,並且沒有訪問範圍信息附加到該方法。 這可能已經實現,但Objective-C缺少如C++或Java中的privateprotected等等。 請注意,實現這種行爲在運行時會更慢。

+1

您能否解釋爲什麼在實現文件中使用IBOutlet ivars有潛在危險? – 2012-01-04 09:46:02

+0

因爲這意味着你的一些代碼有意訪問你的私有數據,而這些數據在設計上是危險的,並且違反了OOP範式 – Geoffroy 2012-01-04 13:14:27

+0

@Geoffroy,所以你認爲在實現文件中包含IBOutlet和IBAction是個壞主意只要? – Enchilada 2012-01-04 14:16:33