2009-07-25 7 views
2

私はiPhone SDK 3.0を使用していますが、これは物事がどのように動作するかについての一般的な誤解であると思います&メモリ管理。ポインタメモリ管理の誤解/ objective-c

私は離れて上記のビューコントローラから切り替えると、すべてが正常に動作するスイッチバックしようとしたとき、私はこの

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

ようviewWillAppearメソッドをオーバーライドしてきました。

しかし、私はと考えてのNSArrayへの参照がbottomBarによって保持されるため、元のポインタを "items"に "解放"しています。 これを行うと(以下のコードを参照)、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]; 
} 

は、私はこのケースでないリリース項目に必要ですか?または私は何か間違っているのですか? 明らかに、経験的な証拠は、私が "アイテム"をリリースすべきではないことを示していますが、なぜこれが当てはまるのかはわかりません。

情報/ "ポインタ"ありがとう!

+0

ありがとうございます!リンクに感謝します。 – user141146

答えて

3

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

+1

あなたはそれをリリースする責任はありませんが、自動リリースされたオブジェクトであるという保証はありません。あなたが知っていることは、あなたが所有していないことだけです。 でルールを読んでください。 –

0

arrayWithObjects:NSArrayにお問い合わせの際:あなたは自動解放配列が返され

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

alloc,new、またはcopyが含まれているメソッドを呼び出さないため、配列はオートレリースされたユーザーに返されます。これは、そのオブジェクトをメモリ管理する必要がないことを意味します。

しかし、あなたがその1までカウントを保持ぶつけ、引数として配列を渡す、self.bottomBarsetItemsを呼び出すときに保持されます(詳細については、Memory Management Programming Guide for Cocoaを見てみましょう)が、その後、あなたは戻って、それを解放その保持カウントは0に戻り、割り当てが解除されます。

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

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

+0

あなたはそれをリリースする責任はありませんが、自動リリースされたオブジェクトであるという保証はありません。あなたが知っていることは、あなたが所有していないことだけです。

0

ここで短いバージョンです。一方

、あなたが行っていた場合:

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

これは1の保持カウントを持つオブジェクトが作成されますので、あなたが漏れることを防ぐためにそれを解放する必要があります。

詳しくはMemory Management Programming Guide for Cocoaをご覧ください。

+0

のルールを読んでください。あなたがそれをリリースする責任はないのですが、それは自動リリースされているという保証はありませんオブジェクト。あなたが知っていることは、あなたが所有していないことだけです。 の規則をお読みください –

+0

私はこの区別を認識しています、ありがとうございます。私は、Objective-Cの初心者が理解する方法を説明しようとしていました。なぜなら、このトピックを実際に学びたいのであれば、私が指摘したのとまったく同じドキュメントにリンクしました。 –

+0

私はあなたのことがこのように失敗した答えの中で最高だったことに同意します。しかし、あなたがその区別を知っているならば、初心者に混乱を与えないでください。オートレリースされたオブジェクトについて話を始めると、そこからカウントを保持することとその下のすべての丘が考えられます。メモリ管理のルールは簡単で分かりやすく、自動解放やカウントを保持することについて何も言わないが、初心者は混乱しがちです。 –

0

天国のために、人々をMemory Management Rulesに指名するだけです。それらの言い換えをしないでください。 「オートレリースされたオブジェクトを返す」と言ってはいけません(必ずしも真実ではなく、真実であっても無関係です)。それらをルールに向けるだけです。

ルールは合計で9段落です!言い換えて、言い換えたり、言い直したりする必要はありません。彼らは明快で簡潔で明白です。

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