31

我正在关注“Objective-C 编程”第 3,但我在第一个示例中遇到了问题。

我不断收到此错误:

语义问题:“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;
}

任何见解将不胜感激。

4

5 回答 5

42

要求编译器在启用 ARC(自动引用计数)的情况下编译文件。关闭它,或者更好的是,使您的示例现代化:

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

(不,我不能告诉你具体如何关闭 ARC,如果这是由于上述 NDA 而你要走的路线。)

于 2011-07-11T20:10:08.610 回答
17

快速发布以防万一你还在寻找

您可以在构建设置中禁用 ARC。

  • 在左侧的管理器中单击您的项目。
  • 选择你的目标,在下一列中结束。
  • 选择顶部的构建设置选项卡。
  • 向下滚动到“Objective-C Automatic Reference Counting”(它可能在User-Defined设置组下列为“CLANG_ENABLE_OBJC_ARC”),(如果在构建设置下没有找到 ARC 选项,您可能需要切换编译器。您可以在构建设置下找到它)
  • 并将其设置为 NO。
于 2012-03-23T12:24:50.790 回答
5

就我而言,我希望启用 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]));
    }
}
于 2013-07-22T16:01:19.057 回答
3

这是Apple 向 ARC 的过渡指南的链接。

好的...检查一下。对 NSAutoreleasePool 的特定更改 - 这是 Xcode 在您创建第一个应用程序时自行初始化的方式。我不了解你,但我喜欢这个主意!

如果您正在阅读 Kochan 的书,请不要担心。开始您的项目时,只需取消选中“使用 ARC”框。一切都会奏效。

于 2011-12-06T15:32:54.680 回答
-1

首次创建新项目时启用 ARC。正确知道我知道如何启用或不启用它的唯一方法是在您第一次创建程序时。这是您必须取消选择的复选框之一。

于 2013-02-07T22:38:54.233 回答