NSAutoreleasePool不可用。

31

我正在学习《Objective-C编程》第三版,但是在第一个例子中遇到了问题。

我不断收到这个错误:

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

非常感谢任何见解。


2
请确认您是否能够阅读自己的问题 - 代码需要标记为代码。 - mmmmmm
2
狮子预览不是受NDA保护吗? - Caleb
1
ARC不受NDA约束,但Lion和iOS 5受到保密协议的限制。 - bbum
@Greg,请尝试在http://devforums.apple.com/上提出这样的问题。 - Caleb
2
不,这是一个非常真实的问题,并且可以在这里得到答案。请仔细回答。已编辑问题,不再包含任何NDA保密协议。 - bbum
显示剩余2条评论
5个回答

42
编译器被要求启用ARC(自动引用计数)来编译文件。关闭它或者更好的方法是现代化您的示例代码。
int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog (@"Programming is fun!");
    }
    return 0;
}

(不,如果你因为前面提到的保密协议而选择这条路线,我不能告诉你具体如何关闭ARC。)


2
你的评论“现代化你的例子”让我感到担忧——我也正在开始阅读原问题中提到的同一本书,如果这本书的第一个例子正在做一些“过时”的事情,那么是否值得继续阅读或者我应该寻找一本新书呢? - chrixian
1
这些知识仍然适用。即使使用ARC,理解手动保留/释放的细节仍然很有用。事实上,即使您只想编写iOS应用程序,了解其他语言也会对您有所裨益。但是,是的,该书记录的模式不再是最现代的。 - bbum
@bbum 在释放时会遇到类似的问题。您将如何“现代化”:self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease];如果这很简单,我道歉,但我只是在为一个PhoneGap项目使用XCode,并不了解Objective C内存管理的知识。 - Jack

18

如果您仍在寻找信息,您可以在构建设置中禁用ARC。

  • 点击左侧的组织器中的项目。
  • 在下一列中选择您的目标。
  • 在顶部选择构建设置选项卡。
  • 向下滚动到“Objective-C Automatic Reference Counting”(在用户定义设置组下可能会被列为“CLANG_ENABLE_OBJC_ARC”),如果您在构建设置中没有找到ARC选项,则可能需要切换编译器。您可以在构建设置中找到它。
  • 将其设置为NO。

这个方法在我的OS X Lion上解决了问题 - 谢谢Jason! - Anthony

5
在我的情况下,我希望开启ARC,并想要更新一个示例项目以正常工作。苹果的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]));
    }
}

3
这里有一份苹果公司的自动引用计数(ARC)转换指南的链接
如果你使用Xcode创建第一个应用程序,可以查看这个关于NSAutoreleasePool的具体更改。我不知道你是否喜欢这个想法,但我很喜欢!
如果你正在跟随Kochan的书进行学习,不用担心。在启动项目时,只需取消“使用ARC”框的选中即可,一切都会正常工作。

-1

当您首次创建新项目时,ARC 已启用。目前我所知道的唯一启用或禁用它的方法是在您第一次创建程序时。这是您必须取消选择的复选框之一。


@JasonRogers的回答中关于如何关闭ARC的部分是错误的吗? - mmmmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接