2011-10-18 52 views
3

在ARC下,讓每個IBOutlet成爲一個屬性有什麼意義?對於僅在視圖控制器內部使用的IBOutlets使用ivars有什麼缺點?在ARC下使用IBOutlets屬性的有用性?

+0

你爲什麼認爲必須創建屬性? – Phlibbo

+0

@Phlibbo:我一直在這裏和那裏看到,這是「良好的做法」,並簡化了viewDidUnload代碼。 –

+0

我希望有一本類似於Scott Meyers和Herb Sutter爲C++編寫的書的「有效的iOS」書。 –

回答

8

如果您不使用setter/getter方法進行任何操作,請不要依賴這些屬性的鍵值觀察,也不要預期子類會從覆蓋這些屬性中受益,那麼就沒有真正的在ARC下使用IBOutlets的ivars的缺點。

+0

謝謝,ivars會在我的代碼中消除很多'self.'前綴。 –

+0

請查看我的答案,並讓我知道你是否對任何事情有所瞭解。 –

0

我一直在爲我的「私人」IBOutlets使用ivars,並遇到內存泄漏問題。我認爲這是因爲我的IBOutlets使用__unsafe_unretained屬性而不是__weak。我不能使用__weak,因爲它不支持iOS 4(我希望我的應用程序與iOS 4向後兼容)。很難掌握ARC,IBOutlets,viewDidUnload以及所有這些混亂情況的真實情況。唉...

總之,當我將IBOutlets從ivars更改爲屬性時,內存泄漏問題就消失了。

因此,要回答我自己的問題,使用IBOutlets的ivars的一個缺點是,如果您擁有__unsafe_unretained屬性,則可能會遇到內存泄漏。

+0

這不可能是你的泄漏源頭。如果你的網點是'__unsafe_unretained',那麼根據定義,這些ivars沒有保留它們的目標,*不保留*某件東西永遠不會導致泄漏。 (它可能導致崩潰,但這是另一回事。)你沒有指定你添加的屬性是否同樣是'unsafe_unretained',但無論哪種方式,通過添加屬性你可以做的唯一的事情就是*更多*保留。沒有更多的細節,不可能說出你爲什麼泄漏。如果你真的好奇,你可以提交另一個問題。 –

+0

我添加的屬性確實是'unsafe_unretained'。我真的很困惑,爲什麼將IBOutlets從ivars更改爲屬性會產生變化。也許我沒有正確解釋XCode的儀器。 –

+0

unsafe_unretained可能會導致崩潰,但不會導致泄漏。我會說你正在解釋器械錯誤。抱歉。 :)但那就是說,現在已經有好幾個月了:你對所發生的事情有更多的瞭解嗎? –