相关疑难解决方法(0)

为什么ARC仍然需要@autoreleasepool?

在大多数情况下使用ARC(自动引用计数),我们不需要考虑使用Objective-C对象的内存管理.不允许再创建NSAutoreleasePools,但是有一个新的语法:

@autoreleasepool {
    …
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我不应该手动释放/自动释放时,为什么我需要这个呢?


编辑:总结我从所有的答案和评论中得到的简洁:

新语法:

@autoreleasepool { … } 是新的语法

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
…
[pool drain];
Run Code Online (Sandbox Code Playgroud)

更重要的是:

  • ARC使用autorelease以及release.
  • 它需要一个自动释放池才能这样做.
  • ARC不会为您创建自动释放池.然而:
    • 每个Cocoa应用程序的主线程都有一个自动释放池.
  • 有两种情况你可能想要使用@autoreleasepool:
    1. 当您在辅助线程中并且没有自动释放池时,您必须自己制作以防止泄漏,例如myRunLoop(…) { @autoreleasepool { … } return success; }.
    2. 当你想创建一个更本地的游泳池时,正如@mattjgalloway在他的回答中所示.

memory-management objective-c xcode4.2 automatic-ref-counting

191
推荐指数
4
解决办法
7万
查看次数

如何在xcode项目中启用/禁用ARC?

如果已在禁用ARC的情况下创建项目,如何启用它,反之亦然?

xcode objective-c automatic-ref-counting

57
推荐指数
3
解决办法
9万
查看次数

如何修复此错误:"ARC禁止在Xcode中显式发送'release'消息"

我试图从图像数组中在iPhone中制作一个简单的动画图像:

- (void)viewDidLoad {
    NSArray *imageArray;
    imageArray = [[NSArray alloc] initWithObjects:
                  [UIImage imageNamed:@"sun1"],
                  [UIImage imageNamed:@"sun2"],
                  nil];
    fadeImage.animationImages = imageArray;
    fadeImage.animationDuration = 1;
    [imageArray release];  //==== HERE IS WHERE I GET THE ERROR ======
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

iphone animation objective-c automatic-ref-counting

34
推荐指数
1
解决办法
6万
查看次数

如何将ARC项目转换为非ARC?

据我所知,我知道我们使用-fno-objc-arcflag为ARC项目中不支持ARC的文件禁用ARC.

此外,我们还可以使用-fobjc-arcflag来启用ARC,以便在非ARC项目中支持ARC文件.

但是,如果我想将我的ARC项目(非特定文件)转换为非ARC项目,那么我应该如何进行相同的操作呢?

有人请介绍一下同样的问题.

提前致谢.

iphone automatic-ref-counting

8
推荐指数
2
解决办法
5709
查看次数

ios - 'autorelease is unavailable'错误和'ARC禁止显式消息发送autorelease'错误

我有一个工作正常的应用程序.然后我尝试将导航控制器嵌入到tabbarcontroller中,接下来我知道我在编译期间开始收到这些错误.

谁会知道为什么这些会发生?某些设置是否未经检查或意外检查?

谢谢,亚历克斯

reference-counting ios automatic-ref-counting ios6

3
推荐指数
1
解决办法
1万
查看次数