2

私は iPhone SDK 3.0 を使用していますが、これは、c およびメモリ管理がどのように機能するかについての一般的な誤解だと思います。

このようにviewWillAppearメソッドをオーバーライドしました

@implementation MyViewController
- (void)viewWillAppear:(BOOL)animated {
  NSArray *items = [NSArray arrayWithOjbects:self.searchButton, self.trashCan, nil];
  [self.bottomBar setItems:items animated:YES];
}
// other stuff...
@end

上記のView Controllerから切り替えて元に戻そうとすると、すべてが正常に機能します。

しかし、NSArrayへの参照がbottomBarによって保持されていると思うので、私の傾向は「アイテム」への元のポインタを「解放」することです。しかし、これを実行して (以下のコードを参照)、UIViewController から切り替えようとすると、メモリ管理エラー (-[CFArray count]: 割り当て解除されたインスタンス 0xd5f530 に送信されたメッセージ) が発生します。

- (void)viewWillAppear:(BOOL)animated {
  NSArray *items = [NSArray arrayWithOjbects:self.searchButton, self.trashCan, nil];
  [self.bottomBar setItems:items animated:YES];
  [items release];
} 

この場合、アイテムを解放する必要はありませんか? それとも私は何か間違ったことをしていますか?明らかに、経験的な証拠は、私が「アイテム」をリリースすべきではないことを示していますが、なぜそうなのかは私には明らかではありません.

情報/「ポインター」をありがとう!

4

4 に答える 4

3

初期化したことがないので、解放する必要はありません。[NSArray arrayWithObjects:...]自動解放されたオブジェクトを返します。メソッドから返されたときに自動解放メッセージが送信されているため、解放する責任はありません。初期化したものをリリースするだけです!(使用[[NSArray alloc] initWithObjects:...]していた場合は、使用する必要がありました。)

于 2009-07-25T18:39:50.187 に答える
0

電話をかけるarrayWithObjects:NSArray

NSArray *items = [NSArray arrayWithObjects:self.searchButton, self.trashCan, nil];

自動解放された配列が返されます。allocnew、または配列を含むメソッドを呼び出さないため、配列は自動解放されて返されますcopy。これは、そのオブジェクトをメモリ管理する必要がないことを意味します。(詳細については、Cocoa のメモリ管理プログラミング ガイドを参照してください)

ただし、setItemsonを呼び出すと保持されself.bottomBar、配列を引数として渡し、保持カウントを 1 に増やしますが、その後解放して保持カウントを 0 に戻すと、割り当てが解除されます。

配列は によって保持されるため、配列self.bottomBarのメモリを管理していることを意味します。必要がなくなると、配列は解放されます。これは、クラスが配列を必要としなくなったことを意味します。これは、メモリを管理する正しい方法です。

于 2009-07-25T18:40:57.767 に答える
0

短いバージョンは次のとおりです。

+[NSArray arrayWithObjects:] はあなたが所有していないオブジェクトを返すので、それを解放すべきではありません。

一方、実行した場合:

NSArray *items = [[NSArray alloc] initWithObjects:self.searchButton, self.trashCan, nil];

これにより、保持カウントが 1 のオブジェクトが作成されるため、リークを防ぐために解放する必要があります。

詳細については、Cocoaのメモリ管理プログラミング ガイドを参照してください。

于 2009-07-25T18:41:32.773 に答える
0

念のため、人々にMemory Management Rulesを紹介してください。それらを言い換えないでください。「自動解放されたオブジェクトを返す」と言わないでください (これは必ずしも真実ではなく、真実であっても無関係です)。ルールを示すだけです。

ルールは全部で9段落!それらを言い換えたり、要約したり、言い換えたりする必要はありません。それらは明確かつ簡潔で明示的です。

ルールを読み、ルールに従えば、メモリ管理の問題は発生しません。

于 2009-07-26T14:10:21.430 に答える