1

我的一個風險投資公司有一個叫ArticleViewController的問題。從不調用dealloc方法,當視圖打開和關閉三次時,有三個VC活着。該委託屬性是否強烈引用?

我讀here(偉大的來源,當你在你的ViewController一個保留循環!)以下:

如果使用

someObj.delegate = self; 

視圖控制器內,檢查委託財產上someObjweak

@property (nonatomic, weak) id delegate; 

其中一個片段在我的VC是:

PopViewController *pop=[[PopViewController alloc] initWithNibName:@"PopViewController" bundle:nil]; 
pop.delegate = self; 

所以我在PopViewController.h檢查屬性較弱。

由於strong是默認的,並沒有明確的weak這裏,這會導致我的保留週期?我有點懷疑,因爲我在例如頭文件中看到了同樣的事情。 UIPopoverController.h,它在UIKit中。

@property (nonatomic, assign) id <UIPopoverControllerDelegate> delegate; 
+0

'assign'應改爲'weak',但'assign'不會導致您的參考週期,因爲'assign'不會增加參考計數。你必須有別的東西引起參考循環。 – rmaddy

回答

1

您應該將其更改爲weakassign是基元類型的默認值,應該由基元類型使用。 id是一個對象,所以它應該是weakstrong - 在這種情況下爲weak,因爲您不應該增加引用計數器。

你可以閱讀更多關於strong/weak/assign在這裏,因爲我注意到就很好的解釋:SOF question about ARC

很高興看到它對你來說是一個重要的例子,因爲許多人甚至在Obj-C中不那麼新,只是「跳過」這個問題,並在稍後遇到內存問題。

- 編輯 -

也許你裏面有什麼塊和你保持很強的參考自我裏面?任何派遣或任何東西?也許你有另一個控制器的財產,這就是爲什麼它仍然存在?

+0

你實際上並沒有回答這個問題:*「由於strong是默認值,並且這裏沒有明確的弱點,這是否會導致我的保留週期?」* – rmaddy

+0

如果'assign'不會增加引用計數並且'strong'那麼,如何(根據答案中的鏈接)將'strong'和'assign'作爲默認值?它們不是相互排斥的嗎? – physicalattraction

+1

@physicalattraction'strong'是對象的默認值('id'是一個對象),'assign'是基本類型('int'等)的默認值。 – Vive

1

Transitioning to ARC Release Notes

assign幾乎是同樣的事情weak在這個意義上,它不會增加的保留對象的數量,所以它不能是你的保留週期的來源。

weak不同的是,當尖銳的物體被釋放,一weak指針將nil本身,而是assign(或__unsafe_unretained)指針仍將指向free'd內存,導致下一次你試圖崩潰解除引用。

TL;博士:你可以保持assign,這是不是你的內存問題的根源,但使用weak更安全,會產生更少的崩潰(因爲消息nil是無操作)。