2011-05-30 49 views
0

我使用的NSArray名爲allAvailableServices。 首先我初始化它,之後寫了[allAvailableServices release]; 然後我檢查了條件if(allAvailableServices)。 它是真的! 我可能知道原因。 後來我寫了 allAvailableServices = nil;[allAvailableServices release]; 上面的代碼後,如果(allAvailableServices)來到false.is那裏,我以後allAvailableServices = nil;零和釋放的問題?

寫道[allAvailableServices release];每當allAvailableServices = nil我需要分配新array.so如果我沒任何問題打電話[allAvailableServices release];我想有一個記憶問題,我糾正了嗎? 任何人都可以爲我提供一個處理它的最佳方式嗎?

回答

7

發佈只是回收內存,但指針值沒有改變;它仍然包含一個值,但它指向垃圾。

這就是爲什麼許多人將其釋放後NIL其指針:

[allAvailableServices release], allAvailableServices = nil; 

在Objective-C,它是安全的消息發送到零,而是將消息發送到已發佈的對象可能導致應用程序崩潰(通常使用EXC_BAD_ACCESS)

請注意,在將對象設置爲nil之前,我已經釋放了該對象。如果反過來這樣做,你就失去了發送釋放消息的指針,所以你已經泄漏了這個對象。

1

如果使用訪問器,則可以直接將值設置爲零,它會調用release並將它們設置爲nil。發佈將參考計數減1,如果達到0,則釋放該對象。

如果您不設置爲nil,並且因此在if條件中存在問題,則內存仍具有一些值。

更清潔的方式是使用訪問器並致電self.yourvariable = nil;

+0

+1用於提示屬性。 [屬性](http://programmers.stackexchange.com/questions/36262/what-guidelines-do-you-suggest-for-using-objective-c-properties/78328#78328)而不是ivars幫助*很多*避免內存問題。 – 2011-05-30 11:53:46