2009-09-09 91 views
1

在Objective-C中分配對象的正確方法是什麼?分配了Objective-C對象

我見過的示例代碼(這似乎如果它沒有被分配到唯一的工作):

如果(對象!){...}

我也嘗試設置對象=零,但這是一個乏味的過程,每次都會讓人感到有點煩。

但是,如果我有一個對象,我想多次分配和釋放它,那麼正確的方法是什麼?謝謝!

回答

4

除了簡單地發送消息並查看是否崩潰之外,無法判斷變量是否指向有效的對象。對象變量只是指針。要告訴的唯一方法是使用標記值(例如nil)。但這通常不是問題。如果這給你帶來麻煩,那就證明你的應用程序設計存在缺陷。沒有理由讓變量掛起來,可能會被初始化或不可能。

+0

您可以聲明不指向事物的變量,但不應該存在不知道是否指向某些事物的情況。你可以聲明一個指針而不是設置它,稍後再做,但你應該知道它的設置+! :D – 2009-09-09 01:02:24

4

你應該總是初始化對象變量爲零,如果你不立即分配給他們一個值。如果不這樣做,幾乎可以確保在嘗試訪問未初始化的對象時某個時候會導致崩潰。

然後,你可以做確實

if(!object) 
{ 
    //some stuff 
} 

因爲nil對象是保證返回一個負布爾結果,而不是零任何對象將返回一個積極的結果。

+2

靜態,全局和實例變量始終初始化爲零;重新初始化它們將是多餘的。 (在發佈內容之後將它們設置爲零,但是,必須的(當然在dealloc中除外)) – rpetrich 2009-09-09 05:13:17

+0

@rpetrich請問官方文檔或其他資料來源說,Static,global並且實例變量總是被初始化爲nil'。我以前沒有聽說過。提前致謝。 – MainstreamDeveloper00 2013-07-28 17:46:04

+1

@HarryCater查看Apple的對象分配文檔(http://developer.apple。com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/ObjectAllocation/ObjectAllocation.html#// apple_ref/doc/uid/TP40010810-CH7-SW1)和靜態/全局初始化文檔的C標準 – rpetrich 2013-07-29 07:57:34

0

另一種選擇是調查NSZombie。它可以幫助你識別殭屍(引用已經釋放的內存位置的指針(並可能重新分配給別的東西!)),但你不希望它在生產代碼中使用。

根據您的情況的複雜程度,您需要在釋放變量後將其設置爲零,或者您需要創建另一個變量來跟蹤引用。但所有這些只是在惹麻煩。

如果你真的陷入困境,並且對象變量被某些東西引用,而這些東西只有在完成對象後纔會釋放,那麼只需將對象放入autorelease池並完成它即可。

0

具有屬性的當前最佳做法是發送setter方法nil。所以像@property (nonatomic, retain) UIButton *startButton;這樣的東西就是self.startButton = nil;這隻適用於讀寫屬性。如果只讀屬性或帶有超出setter的實例,則必須在釋放它們之後將它們設置爲零。