2010-06-18 75 views
2

在objective-c中,我看到很多示例代碼,其中作者分配一個局部變量,將其分配給一個屬性,然後釋放局部變量。這樣做有一個實際的理由嗎?我一直只是直接分配給物業的大部分。會以任何方式導致內存泄漏?我想,我想知道是否有這之間的任何差別:局部變量賦值與直接賦值;屬性和內存

HomeScreenBtns *localHomeScreenBtns = [[HomeScreenBtns alloc] init]; 
self.homeScreenBtns = localHomeScreenBtns; 
[localHomeScreenBtns release]; 

這:

self.homeScreenBtns = [[HomeScreenBtns alloc] init]; 

假設homeScreenBtns是一個屬性,像這樣:

@property (nonatomic, retain) HomeScreenBtns *homeScreenBtns; 

我準備將我的應用程序提交到應用商店,以便我處於完全優化/ QA模式。

回答

2

你不能做到這一點:因爲當你[HomeScreenBtns的alloc]初始化]你創建的alloc的對象

self.homeScreenBtns = [[HomeScreenBtns alloc] init]; 

使對象有保留計數爲1.然後,當您將該對象設置爲homeScreenBtns時,它的保留計數爲2,因爲homeScreenBtns也會保留該對象。因此,對象的保留計數永遠不會回到0,因爲唯一的釋放語句位於homeScreenBtns的setter方法中。因此你泄漏內存。如果你想要做一個聲明,而不是第一種方式,你上市,你可以使用:

self.homeScreenBtns = [[[HomeScreenBtns alloc] init] autorelease]; 
+0

廢話,看起來像我有一些重寫要做!謝謝。驚訝我的應用程序並沒有真正崩潰。 – typeoneerror 2010-06-18 07:46:18

5

假設:

@property (nonatomic,retain) HomeScreenBtns *homeScreenBtns; 
  1. HomeScreenBtns * localHomeScreenBtns = [[HomeScreenBtns的alloc] INIT];
  2. self.homeScreenBtns = localHomeScreenBtns;
  3. [localHomeScreenBtns release];

然後(1)意味着retain。 (2)意味着第二個retain,因爲財產如此說。 (3)在由(1)創建的本地範圍中釋放retain

如果你不這樣做(3),你最終會泄漏。

這在所有記錄的memory management guide.

+0

對,我得到了1,2,3。我有什麼理由不能直接分配財產? – typeoneerror 2010-06-18 03:23:26

1

由於內存管理指南說 - 如果你創建了某個實例,你必須管理並釋放。

...allocate]init]; 

創建實例。無論你在代碼中如何處理它,你都必須有一個匹配的「... release」,否則你將導致內存泄漏。

如果你說你已經寫了代碼,它分配了一個類的實例,並在同一行設置屬性,你將有一個內存泄漏...並且你的程序將崩潰...在第一.. 。減速...向下................儘管.....使用........向上............備忘.............