0

ソーシャルネットワークのiOSアプリのようなサンプルアプリがあります。私はcocoaフレームワークに慣れていないので、サンプルコードを研究しています。分析を押すと、アプリで255件のメモリリークが報告されています。非常に単純な約100のリークを解決できましたが、残りは解決できません。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    //DLog(@"found this element: %@", elementName);
    currentElement = [elementName copy];
    if([MethodName isEqualToString:@"SignInStep"])
    {

        if ([elementName isEqualToString:@"item"]) 
        { // clear out our story item caches... 
            item = [[NSMutableDictionary alloc] init];
            currentUserId = [[NSMutableString alloc] init];

            currentError = [[NSMutableString alloc] init];
        } 

    }

}

アイテムの変数の割り当て:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    //DLog(@"ended element: %@", elementName);

    if([MethodName isEqualToString:@"SignInStep"])
    {
        if ([elementName isEqualToString:@"item"]) 
        { // save values to an item, then store that item into the array...
            [item setObject:currentUserId forKey:@"userId"]; 

            [item setObject:currentError forKey:@"error"];

            [SignIn addObject:[item copy]];    //Method returns Objective C Object with +1 retain count 

        } 
    } 

}//Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1

次のエラーが発生しました。

1)メソッドは+1の保持カウントを持つObjectiveCオブジェクトを返します

2)オブジェクトのリーク:割り当てられたオブジェクトは、この実行パスの後半で参照されず、保持カウントが+1になります

私は上記のコードで、これらのリークを正確に受け取った場所について言及しました。誰かがこれを引き起こしているものを教えてもらえますか?

4

3 に答える 3

1

所有するオブジェクトの所有権を放棄する必要があります

id obj =  [item copy];
[SignIn addObject:obj]; // SignIn will retain obj 
[obj release];  

メモリ管理プログラミングガイドをご覧ください

        item = [[NSMutableDictionary alloc] init]; // release this object
        currentUserId = [[NSMutableString alloc] init]; // release this object

        currentError = [[NSMutableString alloc] init]; // release this object
于 2012-10-25T18:41:59.093 に答える
0

Every alloc, retain, copy calls should have equivalent release call. As you are allocating item, currentUserId and currentError in didStartElement. They should be released some where,as per your code it will be mostly in didEndElement:

Remember that whenever objects are added to array or dictionary, the objects will be retained. Those objects will be released whenever array (or) dictionary is released.

id obj = [item copy]; // obj retaincount +1

[SignIn addObject:obj]; // obj retaincount +1

[obj release]; // obj retaincount-1

whenever SignIn is released, obj retain count will become 0.

于 2012-10-25T18:59:16.600 に答える
0

メモリリークに関連するいくつかのポイント。メモリリークを回避するには、次のルールに従う必要があります。

作成したオブジェクトはすべて所有します

名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッド(たとえば、alloc、newObject、mutableCopy)を使用してオブジェクトを作成します。

保持を使用してオブジェクトの所有権を取得できます

受信したオブジェクトは通常、受信したメソッド内で有効であることが保証されており、そのメソッドはオブジェクトを呼び出し元に安全に返すこともできます。次の2つの状況でretainを使用します。(1)アクセサーメソッドまたはinitメソッドの実装で、プロパティ値として格納するオブジェクトの所有権を取得する。(2)他の操作の副作用としてオブジェクトが無効になるのを防ぐため

不要になった場合は、所有しているオブジェクトの所有権を放棄する必要があります

オブジェクトにリリースメッセージまたは自動リリースメッセージを送信することにより、オブジェクトの所有権を放棄します。

所有していないオブジェクトの所有権を放棄してはなりません

参照:アップルのドキュメント

于 2012-10-25T19:17:04.427 に答える