0

我正在做我的項目在xcode 4.2(舊版本)。對於我的應用程序,我只需將dto類中的變量,數組設置爲在整個應用程序生命週期中使用。所以我設置了這樣的屬性。管理目標c中的內存

AppDTO(子類NSObject中的)

AppDTO.h

@property(nonatomic,retain)anotherAppDTO *aAppDTO; 
@property(nonatomic,retain)NSMutableArray *array1; 
@property(nonatomic,retain)NSMutableArray *array2; 
@property(nonatomic,retain)NSString *string1,*string2,*string3; 

AppDTO.m

- (id)init 
{ 
    self = [super init]; 
    if (self) { 

    self.aAppDTO = [[anotherAppDTO alloc]init]; 
    self.array1 = [[NSMutableArray alloc]init]; 
    self.array2 = [[NSMutableArray alloc]init]; 

    self.string1 = @"Hello"; 
    self.string2= @"Hai"; 

    } 
} 


-(void)dealloc 
{ 
    if(array1 != nil) 
    { 
     [array1 release]; 
     array1 = nil; 
    } 

    if(array2 != nil) 
    { 
     [array2 release]; 
     array2 = nil; 
    } 

    [aAppDTO release]; 
    aAppDTO = nil; 

    [super dealloc]; 
} 

當我分析我的應用程序在Xcode 4.3.2,我得到內存警告在self.array1和self.array2(在線上分配的對象上的潛在泄漏...),但是當我將self.array1更改爲array1時,警告消失。

使用自我的原因是什麼。如果我將@property(nonatomic,retain)設置爲變量(如array1,array2,string1,string2),我需要使用self嗎?

另外在dealloc方法中,我聽說我們不想使用[self.array1 release],相反我們可以使用[array1 release]。這是對的嗎?

我是否需要在dealloc方法中釋放我的字符串。

另外我在dealloc方法中發佈aAppDTO。如果我在另一個AppDTO類中分配一些對象,當我調用[aAppDTO release]方法時它會自動釋放。

任何人都可以澄清我。

self.array1 = [[NSMutableArray alloc]init]; 

是一樣的:

[self setArray1: [[NSMutableArray alloc]init]]; 

正如你可以看到你是不是分配

非常感謝, 阿尼什

+0

不需要在'dealloc'中檢查'nil';只是「釋放」對象。另外,'NSString'屬性幾乎總是'copy'而不是'retain'。如果這是一個新項目,您應該使用** ARC **。 – bbum 2012-08-12 14:25:59

回答

4

,因爲當你寫你得到的警告底層array1私有變量,但您正在調用屬性的setter因爲它被聲明爲保留它保留分配一次的對象,這意味着,當你最終將會分配另一個對象與二傳手第二次的第一個對象將繼續留在一個的保留計數,直到應用程序將被關閉(因爲你再也沒有對該對象的任何引用了......)。

看一看this偉大的文章,以更好地理解Objective-C中的手動引用計數。

+0

哦..所以我不需要分配任何對象,如果我使用自我。 NSString是否一樣?在這裏我使用self.string1,它會分配內存(如[[NSString alloc] init]) – Anish 2012-08-12 07:35:12

+0

在構造函數中,您可以簡單地初始化私有變量,而無需調用屬性的設置器... – aleroot 2012-08-12 07:38:35

+0

@Anish i have張貼了我的答案的更新,有一個很好的文章的鏈接,很好地解釋MRC的工作原理,看看... – aleroot 2012-08-12 07:51:43

2

當我分析我的應用程序在Xcode 4.3.2,我得到內存警告self.array1和self.array2(潛在的泄漏對象上分配的行......),但是當我將self.array1更改爲array1 ,警告消失。

分析儀的權利。設置時參數爲retain。同樣,你應該傾向於在初始化和dealloc直接訪問。所以,你應該只寫array1 = [[NSMutableArray alloc] init];,並做好。

使用自我的原因是什麼。如果我將@property(nonatomic,retain)設置爲變量(如array1,array2,string1,string2),我需要使用self嗎?

那些通過訪問器方法。如果不在初始化或dealloc中,則應該傾向於瀏覽訪問器方法,因爲這是完全構造的對象的常見正確執行路徑。

同樣在dealloc方法中,我聽說我們不想使用[self.array1發佈],相反我們可以使用[array1 release]。這是對的嗎?

正確。

我是否需要在dealloc方法中釋放我的字符串。

是的。

此外,我正在釋放aAppDTO dealloc方法。如果我在另一個AppDTO類中分配一些對象,當我調用[aAppDTO release]方法時它會自動釋放。

當其引用計數達到0時,將調用其dealloc

+0

你已經提到過,我需要在dealloc方法中釋放string1。但是對於一個數組,我是否需要在init方法中分配數組,因爲我對數組使用了@property(nonatomic,retain),它已經有了一個retainCount。 – Anish 2012-08-12 07:44:43

+0

@Anish我給的例子不*使用訪問器。該形式將引用傳遞給實例變量(然後可以說'AppDTO'實例擁有引用),然後在調用setter或調用'dealloc'時放棄該引用。另外,objc不會默認初始化屬性 - 初始化只需要調零內存。因此,當初始化程序被調用時,ivar是'nil'。 – justin 2012-08-12 08:03:59

0

我認爲其他人已經回答了你的問題。

我想讓你注意蘋果公司出色的Advance Memory Management Programming Guide: Practical Memory Management,他們在這些場景中走過。第一次閱讀很難完成,但它確實涵蓋了這些內容。在回答關於使用實例變量與訪問器方法的使用問題時,我將注意力放在標記爲「在初始化方法和dealloc中不使用訪問器方法」部分。