2010-12-17 56 views
0

我有兩個控制器,SyncController和XMLController。 SyncController向XMLController發送一些參數,該參數連接到API並將結果作爲對象包裝在NSMutableArray中,然後將數組返回到SyncController。iPhone NSMutableArray發佈問題

一些代碼:

SyncController.h

-(void)urlHandler:(NSArray *)urlHandler listObjectsFinishedLoading:(NSMutableArray *)resultData; 

SyncController.m

- (void)urlHandler:(NSArray *)urlHandler listObjectsFinishedLoading:(NSMutableArray *)resultData; 
{ 
    NSMutableArray *receivedObjects = [[NSMutableArray alloc] init]; 
    [receivedObjects addObjectsFromArray:resultData]; 
    for (Object *o in receivedObjects) { 
    //DO SOME STUFF 
    } 
    [receivedObjects release]; 
} 

XMLController.h

@interface XMLController : NSObject { 
    NSMutableArray *objects; 
} 
@property (nonatomic, retain) NSMutableArray *objects; 

XMLController.m

-(void) connectionDidFinishLoading:(NSURLConnection *) connection { 
    objects = [[NSMutableArray alloc] init]; 

    if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) { 
    [delegate urlHandler:self listObjectsFinishedLoading:objects]; 
    } 

    //[objects release]; 
} 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    // Initialize an Object 
} 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
    // Put some properties unto Object 
    // Ad Object to the objects array 
    // release Object 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    //[objects release]; 
} 

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

我的問題是,我該如何正確釋放對象數組?如果我不釋放它,代碼就可以正常工作(來自// DO SOME STUFF的動作被執行),但它顯然會泄漏。如果我釋放它,無論我做什麼(請參閱評論// [對象發佈];在三個地方)應用程序崩潰。

有什麼建議嗎?謝謝。

回答

1

嘗試

if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) { 
    [delegate urlHandler:self listObjectsFinishedLoading:[objects autorelease]]; 
} 
+0

這個SO問題解釋了爲什麼這可能是正確的答案:http://stackoverflow.com/questions/1219575/objective-c-release-autorelease-and-data-types – 2010-12-17 10:07:24

+0

謝謝,但沒有它不起作用。仍然崩潰。 – Dann 2010-12-17 10:08:35

0

也許你在- (void)dealloc重新分配對象爲- (void)parserDidEndDocument:(NSXMLParser *)parser又一遍。嘗試在釋放它時將對象設置爲零(≠NULL),所以您知道它不會再次釋放。這樣它肯定工程

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    [objects release], objects = nil; 
} 
0
-(void) connectionDidFinishLoading:(NSURLConnection *) connection { 
NSMutableArray *temp=[[NSMutableArray alloc] init]; 
self.objects=temp; 
[temp release]; 


    if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) { 
    [delegate urlHandler:self listObjectsFinishedLoading:objects]; 
    } 

    //[objects release]; 
} 


and then 

- (void)dealloc {  
    //[objects release]; 
    [self.objects release]; 
    [super dealloc]; 
} 

使用。

0

您將objects定義爲保留屬性,然後直接尋址實例變量。如果您使用合成來生成getter和setter,那麼讓他們爲您執行內存管理。

self.objects = [[[NSMutableArray alloc] init] autorelease];

self.objects = nil;

而不是手動做發佈。

0

感謝您的幫助。仍然不起作用,但我覺得這個問題可能在Object類中。釋放數組調用每個對象的權利釋放?

Object.h

@interface Object : NSObject { 
    NSString *name; 
} 
@property (nonatomic, retain) NSString *name; 

Object.m

-(void) dealloc{ 

    [self.name release]; 
    [super dealloc]; 
} 

如果我評論了[self.name發佈]行,那麼有問題的數組可以被釋放,它不會崩潰,並且沒有泄漏。但是,然後應用程序在使用Object name屬性的其他地方泄漏NSStrings。

這可能是一些非常微不足道的事情,我錯過了。

謝謝。

+0

你在哪裏分配對象的「名稱」屬性? – EmptyStack 2010-12-17 11:09:13