0

我正在開發一個啓用了ARC選項的iPhone應用程序。我在.h文件中創建IBOutlets,這些文件從文件所有者圖標連接到.xib elements.for例如。在啓用ARC的情況下將強引用對象設置爲零?

IBOutlet UIButton *bt; 
@property(nonatomic,retain)IBOutlet UIButton *bt; 

在.m文件,我在做什麼

@synthesize bt; 

是否有必要在viewDidUnload方法明確設置bt爲零?即self.bt = nil; in viewDidUnload

此外,我是否需要在啓用ARC選項的情況下編寫dealloc方法?我應該在什麼時候將IBOutlets元素作爲強和弱引用與ARC啓用?

回答

2

有必要把你的網點零在viewDidUnloaddealloc

由圓弧意味着你不需要寫在你的dealloc方法(它就會自動完成)之間的差異,但是viewDidUnload方法用於另一個目的,並且釋放內存,以防內存警告發生時應用程序不使用內存。 dealloc仍然需要在某些情況下,例如,當你的類被註冊的通知,或者當你的類是別人的委託和你不希望一些出問題的回調給你一個不好的訪問

當你一個內存警告,所有UIViewControllers不會顯示將卸載其視圖,並調用該方法釋放內存。如果你仍然保留插座(如按鈕,表格等),它們將不會被釋放,從而導致viewDidUnload方法失效。

+1

「他的viewDidUnload方法服務於另一個目的,它釋放應用程序在發生內存警告時未使用的內存」NOPE。爲此目的,有didReceiveMemoryWarning。 – 2012-08-30 19:40:47

+2

它們都會在內存警告中被調用,但將網點設置爲零的正確位置是在viewDidUnload中......當您創建新的UIViewController子類時,它甚至會在該方法中註明! – Ismael

2

使用ARC時,不需要使用修飾符,例如retaincopy。這種內存管理是使用strongweak修飾符自動完成的。

您也不必擔心編寫dealloc方法。

strongretain等價,所以你應該用它

@property(nonatomic, strong) IBOutlet UIButton *bt; 

就是這樣界面生成器默認創建紀念他們的網點。

我不會詳細討論它們的語義差異,但是如果您想知道發生了什麼並閱讀strongweak修飾符的詳細信息,您應該看看Apple's guide on transitioning to ARC

編輯: 對不起,接口生成器默認創建weak網點。

編輯2: strongretain確實100%相同。(感謝@Adam)

編輯3: 您設定指針nil避免得到任何message sent to deallocated instanceBAD_ACCESS_EXCEPTION錯誤。

如果您實際使用ARC,您應該使您的網點(nonatomic, weak)而不是(nonatomic, strong)。通過使用weak歸零指針,編譯器會自動將您的網點設置爲nil,當沒有其他引用它們時。

所以,總結,如果你使用weak性能,你應該設置你的指針爲零。

+0

感謝您的回答..更多..one的東西..它違背了蘋果指導方針,如果我使用保留而不是強烈的ARC選項啓用?因爲我已經在許多地方使用@property(nonatomic,retain)。 –

+1

我很確定'保留'是100%一樣'強'。所以應該沒有問題,使用它 – jere

+0

雅它沒有產生任何問題,但我不確定是否使用它ARC選項使其違反蘋果指導方針? –

相關問題