1

合成されたプロパティについて少し混乱しています。他のクラスからアクセスできるようにしたい配列があるので、これが私のコードです:

MyClass.h

@interface MyClass : CCLayer {
    NSMutableArray *myArray;
}

@property (nonatomic, retain) NSMutableArray *myArray;

MyClass.m

@synthesize myArray;

-(id)init
{
    myArray = [[NSMutableArray alloc] init];
}

-(void)dealloc
{
    [myArray release];
    myArray = nil;
}

私は今少し混乱しています..myArrayはself.myArrayと同じですか? self.myArray も解放する必要がありますか? ありがとう。

4

5 に答える 5

2

プロパティを保持として宣言しました。これは、を使用して設定すると、自動的に保持されることを意味しますself.myArray。したがって、initメソッドで自動解放された配列を作成し、それを次のように設定するだけです。

myArray = [NSMutableArray array];
self.myArray = myArray;

この場合、deallocメソッドなどで解放する必要はありません。そして、dasblinkenlight が言ったように、それがインスタンスにリンクされて@synthesizeいることを確認したい場合は、使用する必要があります。self.myArraymyArray

于 2012-10-17T09:32:56.910 に答える
1

@synthesizeディレクティブが次のようになっていると仮定します

@synthesize myArray;

すでに行っていること以外に何もする必要はありません。プロパティはその値を同じ名前のインスタンス変数に格納します。

EDITED :self.myArrayメソッドでの設定を示唆する代替案を削除しましたdealloc

于 2012-10-17T09:29:04.547 に答える
0

あなたが提供したコードは本当に正しくありません。

いいえ、プロパティへのアクセスとフィールド自体へのアクセスは同じではありません。

私の推測では、プロパティを使用してフィールドを作成する必要があった古いobjCの例を見ていると思います。

また、コードには@synthesizeディレクティブがありません。

現在のobjCコードでは、プロパティをバックアップするためにフィールドを宣言する必要はありません。フィールドとゲッターおよびセッターは自動合成されます(コンパイラーによって生成されます)。

デフォルトのフィールド生成は、プロパティの名前の前にアンダースコアが付いたものです。

_myArrayを介してフィールドに直接アクセスすると、生成されたゲッター/セッターに含まれている保持コードまたは解放コードをバイパスし、非ARCプロジェクトのメモリを手動で管理する必要があります。

つまり、フィールド定義は必要ありません。また、合成ディレクティブも必要ありません。

_myArrayを使用してフィールドに直接アクセスするか、self.myArrayを介してプロパティにアクセスします

それらは同じものではありません。フィールドの保持、割り当て、コピー、およびアクセスがこれらのセマンティクスを完全にバイパスするように、プロパティ定義に従う生成されたコードを実行します。

プロパティをretainとして定義する場合は、deallocでリリースする必要があります

どちらでも使用できます

self.myArray = nil;

リリースを処理するか、

[_myArray release];
_myArray = nil;

以前の投稿の誰かが、deallocでプロパティをnilに設定すると、問題が発生する可能性があると述べましたが、実際に私のアプリで発生するのを見たことがありません、ymmv

于 2012-10-17T10:08:59.947 に答える
0

質問に答えるには:

私は今少し混乱しています..myArrayはself.myArrayと同じですか?

はい、いいえ。どちらも同じオブジェクト、メモリ内の同じ領域を指しています。myArray または self.myArray を読み取る場合、self.myArray のメッセージ送信オーバーヘッドを除いた動作は同じです。

ただし、myArray に割り当てると、オブジェクトは保持されません。self.myArray に割り当てた場合にのみ保持されます。

self.myArray も解放する必要がありますか?

いいえ。

プロパティを解放するか、nil に設定するかを選択することもできます。プロパティが @synthesize されている限り、両方の例は同じことを行います:

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

-(void) dealloc
{
    [super dealloc];
    self.myArray = nil;
}

各アプローチの長所と短所については、こちらを参照してください。

質問から、あなたは本当に ARC を使うべき開発者だと思います。学ぶことが少なくなり、今後の技術的な問題も少なくなります。ObjC の経験があまりない場合は特に、最近の ARC の使用がいかに重要であるかを過小評価することはできません。cocos2d で ARC を有効にする方法、またはKobold2Dを使用して ARC 対応の cocos2d をすぐに使用できるようにする方法をお読みください。

于 2012-10-17T13:44:28.270 に答える
0

はい、そうです。最良の方法は、プロパティ nil を設定して変数を解放することです。

-(void)dealloc{
    self.myArray = nil;
    [myArray release];

    [super dealloc];
}
于 2012-10-17T09:28:01.183 に答える