13

我正在使用 Apple 指南中的这个非常简单的代码:

NSMutableData *receivedData;

// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                    timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}

但是对于这行receivedData = [[NSMutableData data] retain];Xcode 给了我一个错误:PushController.m:72:25: ARC forbids explicit message send of 'retain'

如何处理?我正在使用 Xcode 4.4.1

4

3 回答 3

44

您当前正在使用 ARC 来为您引用计数。(ARC 是“自动引用计数”,iOS 5 的新功能)。因此您不需要手动保留或释放。您可以一起删除保留调用或通过执行以下操作关闭 ARC:

单击左侧导航视图上的项目名称,转到 Targets -> Build Phases 并添加-fno-objc-arc到任何相关文件的“编译器标志”。

有关删除的信息,请参见此处。

有关 ARC 的基本信息,请参见此处。

于 2012-08-09T05:01:04.350 回答
1

我解决了如下问题。该代码适用于Objective-C。

  1. 无论您编写了将图像从 CIImage 获取到 CGImageRef 的方法的任何文件:

    CGImageRef cgImage = [_ciContext createCGImage:currentImage fromRect:[currentImage extent]];
    

    将该文件设为非 ARC。转到项目 -> BuildPhase -> ComplieSources -> 您的文件 -> 添加"-fno-objc-arc"到您的文件。

  2. 如果您的项目中有 .pch 文件,请进行以下行注释:

    #if !__has_feature(objc_arc)
    #error This file must be compiled with ARC.
    #endif
    
  3. 使用以下函数转到用于创建图像的方法:

    CGImageRef cgImage = [_ciContext createCGImage:currentImage fromRect:[currentImage extent]];
    

    像这样声明 _ciContext:

    1. 在 .h 文件中,声明:

      @property (strong, nonatomic)   CIContext* ciContext;
      
    2. 在您的方法中,创建上下文:

      EAGLContext *myEAGLContext = [[EAGLContext alloc]
              initWithAPI:kEAGLRenderingAPIOpenGLES2];
      _ciContext = [CIContext contextWithEAGLContext:myEAGLContext      options:nil];
      
    3. 使用 _ciContext 创建图像。

    4. 在同一文件中写入以下方法:

       -(void)dealloc
       {
          [super dealloc];
          [EAGLContext setCurrentContext:nil];
       }
      
于 2016-09-01T03:52:28.083 回答
-1

打开或关闭 ARC 是项目级别的设置,如果您需要在两种模式下工作的代码,您需要使用

#if __has_feature(objc_arc)
//dont do a release or a retain or autorelease
#else
//do the release
#endif
于 2012-08-09T05:14:03.290 回答