2011-01-05 12 views
0

以下のシナリオでは、割り当てとメモリの管理がどのように行われ、どのように処理されるのかを教えてください。私は私を悩まthatsの擬コード例や質問を与えていることは、以下のインラインです:iphone autoreleaseの使用に関する質問

interface first 
{ NSDecimalNumber *number1; 
} 

implementation 
..... 

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


================================= 
interface second 
{ NSDecimalNumber *number2; 
} 

implementation second 
..... 
- (First*) check 
{ 
    First *firstObject = [[[First alloc] init] autorelease]; 
    firstObject.number1 = [[NSDecimalNumber alloc] initWithInteger:0]; 
        **// do i need to autorelease number1 as well?** 
    return firstObject; 
} 
+0

この質問に投票していただきありがとうございます。この回答は、Apple開発者のドキュメントに記載されている基本的なメモリ管理に関する質問です。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html しかし、あなたの質問に答えるには、番号1を自動リリースまたはリリースする必要があります。 – Moszi

+1

@Moszi基本ドキュメンテーションで回答できるすべての質問をダウンロードすると、すぐに1日の投票手当を使い果たします。 :-) –

+0

@middaparka hahh :) - 私は "最初に読んでから尋ねる"アプローチが好きです... – Moszi

答えて

1

あなたのコードはそのままです。もし、あなたがオブジェクトを自動リリースすると、その参照カウントはゼロになり、それは解放され、その後number1に格納された値を使用しようとすると、アプリケーションはクラッシュします。

私が追加する唯一の拡張は、既存の値を解放することです。すなわち

[number1 release]; 
number1 = [[NSDecimalNumber alloc] initWithInteger:0]; 

これを行わない場合、number1に割り当てられた前のオブジェクトは、checkが呼び出されるたびにリークします。

+0

最初のリリースの前にnumber1がインスタンス化されているかどうかチェックしてはいけませんか? –

+0

@middaparkaいいえ。最初は 'nil'に設定され、' nil'値でメソッドを呼び出すと何もしません。 – grahamparks

+0

クール - 知っておきたい。 :-) –

-1

あなたはNSDecimalNumberをallocingしているとして、あなたはそれを解放する必要があります。

サンプルコードに基づいて意味のある例を提供するのは難しいですが(「number1」は実際には使用されないため)、一般的なルールはあなたが責任を負うことです任意のオブジェクトの場合alloccopyまたはnewです。オブジェクトが関数の範囲内でのみ必要な場合は、もちろんオートレリースすることができます。

http://interfacelab.com/objective-c-memory-management-for-lazy-people/にある良いブログ記事があります。これは、良い例(いくつかのエッジケースを含む)を提供しているので、読んでおくことをお勧めします。

+0

あなたは**必要もありません**。彼が悪い、メモリリークのアプリケーションを望むなら、それは開発者次第です。 :)あなたが知っているように、私はカテゴリー内でNSObjectのallocメソッドを上書きしています。そのため、オブジェクトは一度保持されますが、arc4random()回数は保持されません。 –

+0

'number1'はインスタンス変数なので、このメソッドの範囲外(必要がない場合はdealloc)に必要と仮定できます。 – grahamparks

+0

@grahamparksうわー - 私は彼がdeallocでそれをリリースする正しいことをしていたことを述べるために私の答えを更新していた。 –

関連する問題