2010-12-17 12 views
0

私は2つのコントローラSyncControllerとXMLControllerを持っています。 SyncControllerはいくつかのパラメータをXMLControllerに送ります。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]; 
} 

私の質問は、オブジェクト配列を正しく解放する方法です。私がそれを解放しなければ、コードは正常に動作します(//何かの処理が実行されます)が、明らかにリークします。私がそれをリリースした場合はどこでも(コメント付き// [オブジェクトのリリース]参照; 3箇所で)アプリケーションがクラッシュします。

提案がありますか?ありがとう。

答えて

1

たぶん、あなたは- (void)dealloc- (void)parserDidEndDocument:(NSXMLParser *)parserして、再度のオブジェクトの割り当てを解除している

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

これはなぜこれが正解かもしれないかを説明します:http://stackoverflow.com/questions/1219575/objective-c-release-autorelease-and-data-types –

+0

ありがとうございますが、うまくいきません。まだクラッシュします。 – Dann

0

してみてください。オブジェクトを解放するときにオブジェクトをnil(≠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を生成するためにsynthesizeを使用している場合は、メモリ管理を行います。

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

self.objects = nil;

ではなく、手動でのリリースを行っています。

0

ご協力いただきありがとうございます。それでも動作しませんが、Objectクラスに問題がある可能性があります。配列を解放すると、オブジェクトごとにreleaseが呼び出されます。

Object.h

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

Object.m

-(void) dealloc{ 

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

私は[self.nameリリース]をコメントする場合は、問題のアレイは解放され、クラッシュは起こりませんし、漏れはありません。しかし、アプリケーションは、オブジェクト名プロパティが使用されている他の場所でNSStringをリークします。

私はそれが間違っているかもしれません。

ありがとうございました。

+0

Objectの "name"プロパティをどこに割り当てるか? – EmptyStack