0

iOSでのメモリ管理を理解しようとしています。私はこのインターフェースを作成しました:

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

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

@end

そしてこれは実装ファイルにあります:

@synthesize pType;
@synthesize pWeapon;

retainpTypeとpWeaponは標準のC構造体ではないため、ヘッダーファイルではプロパティを使用します。私が理解していることから、それらがC構造体である場合は、assign代わりに使用します。私が使用retainしたので、それはこのクラスがオブジェクトを保持することを意味しますか、それともどのクラスがそれをインスタンス化しますか?たとえば、別のクラスでこれを行う場合:

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

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

4

3 に答える 3

1

良い一般的なルールは、あなたが「作成」して所有しているものは何でも割り当て/初期化またはコピーすることです。したがって、それを解放する必要があります。そうです、プレーヤーを所有するオブジェクトは、それを使用し終えたときにそれを解放する必要があります。これは、Playerオブジェクトがメソッド内のローカルスコープに対してのみ作成されている場合、またはそれがivarである場合に適用されます。

ただし、自動解放されたPlayerオブジェクトを作成する場合は、ローカルメソッドの実行が終了した後にPlayerオブジェクトが自動解放されないように、プロパティドット構文または実際の保持メッセージのいずれかを使用してオブジェクトを保持する必要があることに注意してください。

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

また

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

幸運を

于 2011-11-03T21:27:20.170 に答える
1

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

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

つまり、内部プロパティが「保持」されていても、「プレーヤー」オブジェクトが割り当てられている場合は、ある時点でそれを解放する必要があります。

于 2011-11-03T21:40:06.623 に答える
0

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

于 2011-11-03T21:14:38.840 に答える