2011-04-06 101 views
1

我有低於該函數返回分配的內存iPhone開發內存泄露

- (NSString *) getBlock 
{ 
    NSString *block = [[NSString alloc] int]; 
    ....... doing something over here 
    return block; 
} 

// I have the class interface like this 
@interface myDataDetail : NSObject { 
    NSString *myName; 
    NSString *myMarks; 
} 

dealloc { 
    myName release; 
    myMarks release; 

    [super dealloc];  
} 

我做下面的東西

myDataDetail *detail = [[myDataDetail alloc] init]; 
detail.myName = [self getBlock]; //here leak 
detail.myMarks = [self getBlock]; //here leaak 

....在這裏做一些東西

[detail release]; 

當我使用儀器內存泄漏運行應用程序時,我收到了泄漏報告。我在這裏做錯了什麼?有人可以讓我知道實施這種結構的正確方法。

回答

0

在你getBlock功能,你應該在返回前自動釋放對象:

- (NSString *) getBlock 
{ 
    NSString *block = [[NSString alloc] int]; 
    ....... doing soemthing over here 
    [block autorelease]; 
    return block; 
} 

這此功能放棄的「所有權」,但並不立即銷燬它,這樣的功能,訪問它可以聲稱「所有權「

內存管理的一個基本規則是,無論何時調用」alloc「,在指向對象的指針被銷燬之前的某個時刻,你應該對它有相同的函數/對象調用」release「或」autorelease「。因此,由於這是一個單獨的函數,並且不是將指針存儲在類中,所以您需要立即將其釋放。

1

其一,getBlock應自動釋放:

- (NSString *) getBlock 
{ 
    NSString *block = [[[NSString alloc] int]autorelease]; 
    ....... doing soemthing over here 
    return block; 
} 

因爲它是一個getter,它不應該保留。雖然它不應該釋放,因爲這將確保返回的引用無效。

您的兩個字段附帶的屬性應定義爲複製或保留。在你的情況,因爲他們是NSString的,最好是將它們複製:

@property(nonatomic,copy) NSString *myName; 
@property(nonatomic,copy) NSString *myMarks; 
0
- (NSString *) getBlock 
{ 
    NSString *block =[ [[NSString alloc] int]autorelease]; 

    return block; 
}