2012-01-30 6 views
0

をそれを解放:の割り当てや、1つの関数にオブジェクトを初期化し、他の機能に送信すると、私は、オブジェクトを割り当て、初期化することは、この機能を持っているが

+(Item*)getItem:(NSString*)uid{ 
     Item *file = [[Item alloc]init]; 
     //do some stuff 
     return file; 
    } 

、これは、この関数の呼び出しです:

Item *tmp = [LibraryScan getItem:itemid]; 
    //do some stuff 
    [tmp release]; 

私は上記のように、私はそれを得た後、それをリリースしたいと思います。 私はそれを正しくしましたか?私の意見で

+0

代わりに自動解放プールを使用しない特別な理由はありますか? –

+0

このようにする理由は何ですか? – MTA

+0

多くのメモリを使用する特別なアルゴリズムのために、手動でメモリを手動で処理する必要がある場合のみ。さもなければ、autoreleaseは確かに行く方法です。 –

答えて

4

は、あなたは、それを返す呼び出し側は、彼がそれに所有権を望んでいるかどうかを判断させる前に、オブジェクトを自動解放する必要がありますので、

+(Item*)getItem:(NSString*)uid{ 
    Item *file = [[Item alloc]init]; 
    //do some stuff 
    return [file autorelease]; 
} 

Item *tmp = [LibraryScan getItem:itemid]; 
//do some stuff 
//[tmp release]; nothing to release 
1

はい、あなたのコードが正しいです。しかし、非オートレリースオブジェクト(つまり、呼び出し元が解放するオブジェクト)を返すメソッドには、メソッド名にcopy、allocまたはnewが含まれている必要があることを明記するオブジェクト指向命名規則も満たさなければなりません。

実際には非オートレリーズオブジェクトを返す場合は、メソッド名をnewItemに変更します。

+0

あなたのやり方でどのようにしたらよいのですか? – MTA

+0

彼はメソッドの名前が命名規則によると、あるべき意味: +(項目*)getNewItem:(NSStringの*)のuid +(項目*)allocItem:(NSStringの*) UIDまたはそのような何か。 –

+0

@MTA、これはあなたのコードとまったく同じですが、+ getItemメソッド名が+ newItemに変更されました。 – Vladimir

0

それは間違っていませんが、標準的な方法ではありません。それが適切にメモリリークをデバッグするのに役立ちます

Item *tmp = [[LibraryScan getItem:itemid]retain]; 
//do some stuff 
[tmp release]; 

+(Item*)getItem:(NSString*)uid { 
    Item *file = [[[Item alloc]init]autorelease]; 
    //do some stuff 
    return file; 
} 

と:

は、このことによってあなたの実装を変更します。

関連する問題