2010-02-26 62 views
0

我有一些麻煩與下面的代碼上:iPhone內存泄漏和釋放的問題排序數組

NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; 
NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors]; 
NSMutableArray *result = [NSMutableArray arrayWithArray:orderArray]; 

如果我用這個代碼,儀器說我有內存泄漏,爲什麼呢?

使用此代碼:

NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; 
NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors]; 

NSMutableArray *result = [[NSMutableArray alloc] initWithArray:orderArray]; 

我收到了泄漏警告過,但是,如果我自動釋放對象的結果,一個內存錯誤發生。

+0

你的第二個代碼塊是分配一個NSMutableArray,你必須發送一個釋放消息或泄漏。閱讀本文,看看它是否清除了一些混淆(http://www.cocoadev.com/index.pl?AutoRelease) – conorgriffin 2010-02-26 09:46:15

+0

正如我所說,如果我發送釋放消息,我收到一個EXC_BAD_ACCESS。我在一個附件函數中使用這個代碼,它被稱爲無處不在,用一個特定的鍵來排列一個數組。 – arielcamus 2010-02-26 09:48:23

+0

所以,如果我使用此功能: - (NSMutableArray的*)orderArray:(NSMutableArray的*)陣列ByKey:(的NSString *)鍵升序:(BOOL)升序{ \t NSSortDescriptor * idDescriptor = [[[NSSortDescriptor的alloc] initWithKey :按鍵升序:升序] autorelease]; \t NSArray * sortDescriptors = [NSArray arrayWithObject:idDescriptor]; \t NSArray * orderArray = [array sortedArrayUsingDescriptors:sortDescriptors];我們可以看到NSMutableArray * result = [[[NSMutableArray alloc] initWithArray:orderArray] autorelease]; \t \t返回結果; } 當我在其他任何代碼段收到對象時,是否保留該對象? – arielcamus 2010-02-26 09:58:15

回答

2

我想這是一個更好的答案。

- (NSMutableArray *) orderArray:(NSMutableArray *)array ByKey:(NSString *)key ascending:(BOOL)ascending 
{ 
    NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending]]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; 
    NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors]; 
    NSMutableArray *result = [[[NSMutableArray alloc] initWithArray:orderArray]]; 

    [release idDescriptor]; 
    return [result autorelease]; 
} 

所以,你分配idDescriptor,然後你使用它,最後將其釋放。由於您要返回result,因此您可以使用退貨自動將其釋放。我還有一個問題。你在代碼的其他地方參考result