2011-11-03 16 views
0

iOSのメモリ管理について理解しようとしています。パラメータ・タイプとpWeaponは、標準Cの構造体ではないので、私はretainプロパティを使用して、ヘッダファイルでメモリ管理の保持/割り当て

@synthesize pType; 
@synthesize pWeapon; 

:実装ファイル内

@interface Player : NSObject { 
    PlayerType pType; 
    PlayerWeapon pWeapon; 
} 

@property(nonatomic, readwrite, retain) pType; 
@property(nonatomic, readwrite, retain) pWeapon; 

@end 

これ:私はこのインタフェースを作成しました。私が理解しているところでは、C構造体の場合は、代わりにassignを使用します。 retainを使用しているので、このクラスはオブジェクトを保持しているか、クラスをインスタンス化しているクラスを保持していますか?例えば、私は別のクラスでこれを行う場合:

Player *player = [[Player alloc] init]; 

この新しいクラスは[player release]またはオブジェクトが自動的に解放されますを呼び出すことがありますか?

答えて

1

良い/一般的なルールは、あなたがalloc/initまたはcopyを "作成"して所有しているので、それをリリースする必要があるということです。だから、プレイヤーを所有しているオブジェクトは、それを使用し終わったら解放する必要があります。これは、Playerオブジェクトがメソッド内のローカルスコープ用に作成された場合、またはivarである場合に適用されます。

自動演奏されたPlayerオブジェクトを作成することを決心した場合は、ローカルのメソッドの後にPlayerオブジェクトがオートリリースされないようにするには、プロパティのドット構文または実際の保持メッセージを通じてオブジェクトを保持する必要があります。実行を終了しました。

// Retaining an autoreleased object 
self.player=[Player playerWithName: @"George"]; 

または

player=[[Player playerWithName: @"George"] retain]; 

幸運

+0

ありがとうございます。私がヘッダファイルに 'retain'や' assign'を入れていないと、それは違いがありますか? – XSL

+1

は、プロパティのドット構文を使用する場合にのみ使用します。すなわち自己再生装置。あなたのヘッダーファイルの保持は、それぞれのivarのセッターとゲッターメソッドを作成するようにコンパイラーに指示します。 – timthetoolman

0

[[Player alloc] init]の呼び出し元は、新しいPlayerオブジェクトをreleaseメッセージとして送信します。 Playerオブジェクトのプロパティは、その責任に影響しません。

1

あなたが財産を作るコンパイラが生成setterメソッドは必ずオブジェクトが解放され、正しく保持することの責任を取る「保有しました」。このプロパティは、元々参照していた以前のオブジェクトを解放する作業を処理し、割り当てられたオブジェクトを保持(所有権を保持)します。 Playerオブジェクトが解放されたときにも、これらのオブジェクトを解放するために実装ファイルに次のコードを追加する必要があります。

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

これは内部の特性があるにもかかわらず、とき「プレーヤー」オブジェクト「保持」という意味しますあなたがまだある時点でそれをリリースする必要があります。