-2

私はiOS開発に不慣れです。

私は次のような財産を持っています、

@property(nonatomic,retain)NSMutableArray *dataArray;

私はそれを割り当てるために、次のことをしています

self.dataArray=[[NSMutable alloc]init];

ディールロックで私は次のことをしています

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

しかし、アレイの初期化でメモリリークが発生します。ただし、

自分を使わないと漏れる。しかし、配列を初期化するのは書き込みアプローチなのだろうか

自己を使わずに。どんな助けでも大歓迎です。

4

3 に答える 3

1

署名を使用する場合は、self.自動生成された/カスタムゲッター/セッターを介してオブジェクトにアクセスします。セッターは典型的にメモリを管理します、そしてあなたはそれをする必要はありません。selfを使用しない場合は、オブジェクトに直接アクセスします。

dataArrayのデフォルトのセッターは配列に保持されるため、提示したコードはリークしていますself.dataArray = [[NSMutableArray alloc] init]; 。正しい使用法は次のとおりです。

self.dataArray = [[[NSMutableArray alloc] init] autorelease];

また:

_dataArray = [[NSMutableArray alloc] init];
于 2012-11-30T15:16:09.927 に答える
1

dataArrayプロパティがretainで宣言されているため、リークが発生しています。つまり、selfを使用すると(つまり、setterを使用すると)、保持カウントが2になり、解放するのは1回だけです。一方、ivarのみを使用する場合、保持カウントは1(allocのため)であり、1回解放するだけで問題ありません。最初の状況でのメモリリークを回避するには、このように自動解放します。

self.data = [[NSMutableArray alloc] init] autorelease];

これにより、保持カウントのバランスが取れます。アクセスに関しては、deallocメソッド内を除いて、self(セッターとゲッター)を使用してみてください

Cocoa Touch用に開発するときは、最初にメモリ管理のドキュメントを読む必要があります。

また、ARCを使ってみませんか?

于 2012-11-30T15:15:18.240 に答える
0

ここで起こっていることallocは、新しいオブジェクトの保持カウントに1を追加することです。プロパティ参照もオブジェクトを保持しています。このようにしたい場合は、そのうちの1つだけが必要です。一般的な方法は次のとおりです。

self.dataArray = [[[NSMutableArray alloc]init] autorelease];

ただし、@ c.cam108が提案するようにARCを使用し、問題全体を回避することをお勧めします。

于 2012-11-30T15:16:43.673 に答える