web-dev-qa-db-ja.com

NSAutoreleasePoolは利用できません

私は「Objective-Cでのプログラミング」に従っています3rd エディションと私は最初の例で問題が発生しています。

このエラーが発生し続けます:

セマンティック問題:「NSAutoreleasePool」は利用できません:自動参照カウントモードでは利用できません

ここに私のコードがあります:

//
// main.m
// prog1 //
// Created by Steve Kochan on 1/30/11.
// Copyright 2011 ClassroomM, Inc.. All rights reserved. //

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSLog (@"Programming is fun!");
    [pool drain];
    return 0;
}

どんな洞察も大歓迎です。

29
Greg

コンパイラーは、ARC(自動参照カウント)を有効にしてファイルをコンパイルするよう求められています。それをオフにするか、もっと良いことにあなたの例を近代化してください:

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog (@"Programming is fun!");
    }
    return 0;
}

(いいえ、具体的には、ARCをオフにする方法を説明できません。それが前述のNDAのためにダウンするルートだった場合)

39
bbum

まだ見ている場合に備えてクイック投稿

ビルド設定でARCを無効にできます。

  • 左側のオーガナイザーで、プロジェクトをクリックします。
  • 次の列でターゲットを選択します。
  • 上部のBuild Settingsタブを選択します。
  • 「Objective-C自動参照カウント」までスクロールします(ser-Defined設定グループの下に「CLANG_ENABLE_OBJC_ARC」と表示される場合があります)、(ビルド設定の下にARCオプションが見つからない場合は、コンパイラを切り替える必要があります。ビルド設定で見つけることができます)
  • nOに設定します。
16
Jason Rogers

私の場合、ARCをオンにして、サンプルプロジェクトを更新して適切に動作させたいと思っていました。 AppleのNSAutoReleasePoolドキュメントは技術的には正しいものですが、すぐに出てこれを説明しないでください。方法は次のとおりです。

アプリケーションをメインにすると、おそらく次のようになります。

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class]));

    [pool release];

    return retVal;
}

それを次のように変更します。

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class]));
    }
}
5
Eli Burke

AppleのARCへの移行ガイドへの link です。

OK ...チェック this out。 NSAutoreleasePoolに対する特定の変更-これは、最初のアプリを作成するときにXcodeがそれ自体を初期化する方法です。あなたのことは知りませんが、このアイデアは大好きです!

Kochanの本に沿ってフォローしていても心配ありません。プロジェクトを開始するときは、[Use ARC]ボックスをオフにします。すべてが機能します。

3
Gonzofan