2011-03-18 90 views

回答

2

爲什麼IBOutlet中保留數爲2不僅僅是1之間的區別?

你不在乎。不,老實說,你沒有。這正是人們爲什麼會告訴你不要擔心保留數量的原因。你永遠不能保證它會是你期望的任何特定數字。保留計數是Cocoa內部實現細節。沒有理由爲什麼它不應該是100,如果框架想要它,或者甚至UINT_MAX

和是什麼

IBOutlet UILabel *fooLabel; 

UILabel *fooLabel; 

@property (nonatomic, retain) IBOutlet UILabel *fooLabel; 

第一聲明一個實例變量可以作爲出口作用之間的差別。第二個聲明可以作爲出口的財產。加載NIB時,第一種情況下指針直接分配給實例變量,而第二種情況下,訪問器用於分配實例變量。

+0

對於保留計數,我必須釋放兩次出口,第一次viewDiDUnload,然後在dealloc中,我真的不明白爲什麼? – pointeur 2011-03-18 11:11:29

+0

@指針:不,你不知道。忘記保留次數。你唯一關心的是你是否擁有這個物體。你有'分配','新','保留'或'複製'它嗎?如果答案是否定的,那麼你**不得**放行。 – JeremyP 2011-03-18 11:23:00

+0

我所做的只是IBOutlet UIImageView * imageView;但我不得不釋放它兩次,我正在開發一個iphone應用程序,這與加載nib/xib文件有關,我並不真正瞭解 – pointeur 2011-03-18 11:28:03

2
  1. 絕對保留計數值與您自己的內存管理實踐無關。不要依靠它來診斷內存管理問題。你應該看看蘋果的文件 - 鏈接here

  2. 關於你的第二個問題,這裏有一個快速概述

IBOutlet UILabel *fooLabel;爲您Interface Builder的筆尖文件的出口沿聲明一個變量fooLabel。

UILabel *fooLabel;上面沒有Interface Builder的插座。

@property (nonatomic, retain) IBOutlet UILabel *fooLabel;聲明屬性fooLabel和您的筆尖文件的出口。如果將此屬性與synthesize fooLabel合成,它將爲該屬性創建一個getter和setter方法。 (retain)屬性告訴合成的setter方法在釋放舊的值之前保留新的值。

2

1)不要使用retainCount來思考「保持狀態」對象 - When to use -retainCount?

2)在這兩種情況下,出口的對象會因爲KVC的保留(在它的「魔力」)的第一例。這意味着,在這兩種情況下,您必須在完成後釋放它(例如,在dealloc中)。

3)第二個片段保證按預期工作,而第一個片段的行爲看起來像實施依賴於我(我無法找到關於非屬性ivars KVC的明確文檔)。

0

仔細檢查您的代碼是否明確保留標籤([fooLabel retain])。如果不是,那麼不要釋放它兩次。只在dealloc中釋放它。

+0

當聲明IBOutlet UIImageView * imageView;我必須兩次釋放它 – pointeur 2011-03-18 11:25:14

+0

你是否用儀器檢查過你的代碼?有任何泄漏?如果不是不用擔心。只是在dealloc中發佈它。如果你釋放兩次,你可能會得到一個EXC_BAD_ACCESS來釋放對象,所以在釋放對象兩次的時候要小心。 – 2011-03-18 11:40:30