非常に気を遣う必要があると言えます。プログラミングの第一のルールは、ユーザーはあなたが期待することを決してしないということです。
考慮事項:
- アクセサー メソッド。それらを使用します。すべての属性のプロパティを設定し、常に適切な getter/setter メソッドを使用してそれらにアクセスします。
.
object.property = some_other_object; -OR-
[object setProperty:some_other_object];
と
object = some_other_object.some_property;
object = [some_other_object some_property];
次のような誘惑に抵抗してください。
property = some_other_object;
[property retain];
- ObjectAlloc から出力を取得しますか? メモリ リーク、パフォーマンス、オブジェクト割り当てから 4 つのツールがあります。それらのどれもロードされていませんか?
- アプリがクラッシュすると何が得られますか? EXEC_BAD_ACCESS またはその他のエラー?
- バランスの取れた保持 (割り当てまたはコピー) と解放。すべての alloc/copy と release/autorelease のバランスを同じ方法で維持することをお勧めします。アクセサーを常に使用している場合、手動でリリースする必要はほとんどありません。
- 多くの場合、自動リリースは実際の問題を隠します。Autorelease によって、いくつかのトリッキーな割り当ての問題が隠される可能性があります。autorelease の使用を再確認してください。
編集済み(障害コードに基づいて追加)上記の「プログラム受信信号:0」の回答に基づいています。これは、メモリが不足していることを示しています。あなたのコードが次のようなことをするインスタンスを探すことから始めます。
myObject = [[MyClass alloc] init];
[someMutableArray addObject:myObject];
新しいオブジェクトを配列に入れるときに「リリース」がありません。その後、この配列が解放されると、オブジェクト myObject は孤立しますが、とにかくメモリ内に残ります。これを行う簡単な方法は、すべての「alloc」/「copy」メッセージを grep することです。非常にまれな状況を除いて、同じ関数内に "release""/autorelease" のペアが必要です。多くの場合、上記は次のようになります。
myObject = [[[MyClass alloc] init] autorelease];
[someMutableArray addObject:myObject];