簡體   English   中英

在Objective C中釋放內存的最佳方法是什么?

[英]What is the best way to dealloc memory in Objective C?

我有關於內存管理的查詢。

讓我們從一個例子開始吧。 假設我們有一個類如下。

@interface myClass : NSObject {
    NSString *xyz;
}
@end

現在,請參閱實施。

@interface myClass : NSObject {
    NSString *xyz;
}
@end

@implementation myClass
-(void)abc{
    // xyz allocted here
}
-(void)pqr{
    // retained or copied many times or may not a single time
}
-(void)mno{
    // retained or copied many times or may not a single time
}
-(void)jpg{
    // may be released more than one time or may be not
}


//-(void)dealloc{
//  [xyz release];
//  [super dealloc];
//}
//
//-(void)dealloc{
//  if(xyz!=nil && [xyz retainCount]>0){ [xyz release]; xyz=nil; }
//  [super dealloc];
//}

-(void)dealloc{
    if(xyz!=nil){ 
        while([xyz retainCount]>0) 
           [xyz release]; 
        xyz=nil; 
    }
    [super dealloc];
}
@end

在上面的代碼中。 我有三個dealloc函數。 哪個更好? 如果沒有這些,那么請建議你的。

我很困惑,因為Objective C說,每次都必須釋放對象=每次分配/保留。

但大多數示例代碼只有單個語句“[xyz release];” 它不會造成內存泄漏嗎?

這是絕對錯誤的:

while([xyz retainCount]>0) 
       [xyz release]; 
    xyz=nil; 

retainCount永遠不會返回0,因為只要你在retainCount為1並且釋放了該對象,運行時就會立即釋放它,並且永遠不會減少retainCount 即使它確實減少了retainCount,該對象現在也被釋放了。 你怎么會問它什么是retainCount?

簡而言之,您的設計是錯誤的。 如果你無法跟蹤你以更智能的方式保留對象的頻率,那么你將會發生內存泄漏,並且很可能會因過度釋放的對象而崩潰(這會導致應用程序崩潰)。

如果你絕對不能改變你的代碼(如果你說你不能改變我就不相信你),那么你想保留第二個整數ivar,表明你保留xyz ,然后使用弄清楚你應該釋放多少次。 (但是,這應該是絕對的最后努力,因為如果你沒有在30秒內完成這項工作,就會發生Armaggeddon。你應該首先重構你的代碼。)

另外,你忘記了dealloc方法中對[super dealloc]的調用。

- (void)dealloc {
    [xyz release];
    [super dealloc];
}

...是正確的版本。 在Objective-C中,通常不應使用retainCount方法。

如果你想要非常安全,你也可以寫:

- (void)dealloc {
    [xyz release], xyz = nil;
    [super dealloc];
}

我的想法是myClass有一個成員變量(在你的情況下,xyz)。 當創建myClass對象時,它應該通過僅向保留計數添加1來創建(或獲取對xyz的引用)(無論是通過保留還是其他方式取決於具體情況)。

在每種方法中保留xyz並再次釋放它不是一個好主意。 因此,在每個方法的最后,本地對象應該在xyz上沒有比在方法開頭時更多的保留。

當dealloc被調用時,只有那個單獨的保留保持應該保留在xyz上(就myClass對象而言),因此單次調用release就足夠了。 在retainCount為零之前釋放不是一個好主意,因為某個地方的另一個對象可能正在使用它。

要直接回答您的問題,請使用此dealloc:

-(void)dealloc{
    [xyz release];
}

在poperty聲明期間保留的對象需要在dealloc方法中釋放。 所以,如果你要宣布

@property(nonatomic, retain)NSString xyz;

你需要它以dealloc發布為

-(void)dealloc{
    [xyz release];
    [super dealloc]
}

應該在方法中最后一次使用該對象后立即釋放任何其他已分配的內存。

所以,如果你要分配xyz,in

-(void)abc{
    // xyz allocted here
}

那么你應該在同一個方法結束時釋放它。

-(void)abc{
    // xyz allocted here
// do something with xyz

//release xyz

例:

        -(void)abc{
           xyz=[[NSString alloc]init];//this may not be what you are following, but i just meant allocating memory
        // do something with xyz


    [xyz release]  

  //release xyz

在這種情況下,您無需在dealloc方法中釋放它。

同樣不是如果你是聲明xyz並對其進行修飾的屬性,你不應該在你的方法中分配它,也不應該釋放它

    while([xyz retainCount]==0) 
       [xyz release]; 

應該> 0 ,否則不執行-release 即便如此,像這樣解除分配xyz是一種不好的做法,因為xyz可能仍然由其他人擁有。

您應該分配xyz有且僅有一個時間,如果你-copy它來代替xyz ,總是-release舊的。 始終遵循Cocoa內存管理規則。

如果你真的需要對xyz采用多個所有權,並且需要一個單獨的整數ivar來記錄你保留xyz ,那么你在-dealloc有正確的數字來-release

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM