关于C#:ARC禁止发送“保留”问题的明确消息

ARC forbids explicit message send of 'retain' issue

我使用的是苹果指南中非常简单的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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


您当前正在使用圆弧为您引用计数。(ARC是"自动参考计数",iOS 5的新功能)。因此,您不需要手动保留或释放。您可以同时删除所有保留呼叫,也可以通过执行以下操作关闭ARC:

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

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

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


我解决了下面的问题。代码是针对Objective-C的。

  • 无论您编写哪种文件,都可以将图像从ciimage获取到cgimageref:

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

    将该文件设为非圆弧。进入Project->BuildPhase->ComplieSources->Your File->Add "-fno-objc-arc"to your File。

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

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

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

    像这样声明上下文:

  • 在.h文件中声明:

    1
    @property (strong, nonatomic)   CIContext* ciContext;
  • 在方法中,创建上下文:

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

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

    1
    2
    3
    4
    5
     -(void)dealloc
     {
        [super dealloc];
        [EAGLContext setCurrentContext:nil];
     }

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

    1
    2
    3
    4
    5
    #if __has_feature(objc_arc)
    //dont do a release or a retain or autorelease
    #else
    //do the release
    #endif