ARC禁止明确发送“保留”问题的消息

时间:2012-08-09 04:57:10

标签: objective-c xcode cocoa memory-management automatic-ref-counting

我正在使用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

3 个答案:

答案 0 :(得分:43)

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

点击左侧导航视图中的项目名称,转到目标 - >构建阶段并将-fno-objc-arc添加到任何相关文件的“编译器标志”。

See here for info on removing.

See here for basic info on ARC.

答案 1 :(得分: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];
       }
      

答案 2 :(得分:-1)

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

#if __has_feature(objc_arc)
//dont do a release or a retain or autorelease
#else
//do the release
#endif