0

Xcode でプログラムを試しており、新しい Mac Cocoa アプリケーションを作成しました。2 つのインスタンス変数 Caption、Photographer を持つ Photo というクラスがあります。メイン関数では、次のように値を指定します。

Photo *obj = [[Photo alloc]init];
obj.caption=@"Something";
obj.photographer=@"Hari";
NSLog(@"Name: '%@'",[obj caption]);
[obj release];

Name: 'Something' という出力が得られますが、それに伴ってこの行が得られます

2011-02-22 11:56:03 test_1[1402:a0f] * __NSAutoreleaseNoPool(): Object 0x100002078 of class NSCFString autoreleased with no pool in place - just leaking

この行がコンソールに表示される理由を誰か説明してもらえますか?

ありがとう、

ハリハラン

4

1 に答える 1

0

Cocoa は自動解放プールを利用します。自動解放プールは、自動解放されたオブジェクトへの参照を保持し、プールが空になると、-releaseそれらの自動解放されたオブジェクトにメッセージを送信します。

Cocoa は自動解放されたオブジェクトを頻繁に使用するため、ほとんどの場合、Cocoa アプリケーションには少なくとも 1 つの自動解放プールが必要です。Cocoa アプリケーションが実行されると、Cocoa はアプリケーションの自動解放プールを自動的に作成します。

あなたの場合、あなたのアプリケーションは本格的な Cocoa アプリケーションではなく Foundation プログラムのようです。そのため、プログラムの自動解放プールを設定するのはあなたの責任です。例えば、

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Photo *obj = [[Photo alloc] init];
    // …

    [pool drain];
    return 0;
}

自動解放プールは厳密には必要ないことに注意してください。自動解放プールがない場合、プログラムはその警告を出力し、プログラムの詳細によっては、オブジェクトをリークする可能性があります。メモリ リークはプログラムの悪い機能であり、特に長期間使用されるプログラムや大量のメモリを割り当てるプログラムでは、常に自動解放プールを設定することをお勧めします。

-autoreleaseとはいえ、そのコードを送信していないのに、自動解放された文字列があるのはなぜですか? プロパティを合成しcaption、写真のキャプションを含む自動解放された文字列を返すアクセサー メソッドをコンパイラが作成したと仮定しています。を送信[obj caption]すると、自動解放された文字列が返され、自動解放プールを設定していないため警告が表示されます。

于 2011-02-22T07:17:31.103 に答える