Подтвердить что ты не робот

ARC запрещает явное сообщение о передаче проблемы "сохранить"

Я использую этот очень простой код из руководства 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

4b9b3361

Ответ 1

В настоящее время вы используете ARC для подсчета ссылок. (ARC - это "Автоматический подсчет ссылок", новая функция для iOS 5). Поэтому вам не нужно вручную удерживать или отпускать. Вы можете либо удалить свои удерживаемые вызовы, либо отключить ARC, выполнив следующие действия:

Нажмите на название проекта в навигационном окне слева, перейдите в "Цели" → "Сформировать фазы" и добавьте -fno-objc-arc в "флаги компилятора" для любых соответствующих файлов.

См. здесь информацию об удалении.

См. здесь базовую информацию о ARC.

Ответ 2

Я решил проблему, как показано ниже. Код для Objective-C.

  • Какой файл вы написали метод получения изображений из CIImage в CGImageRef:

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

    сделать этот файл не ARC. Перейдите в Project → BuildPhase → ComplieSources → Your File → добавьте "-fno-objc-arc" в ваш файл.

  • Если у вас есть файл .pch в вашем проекте, сделайте следующий комментарий строки:

    #if !__has_feature(objc_arc)
    #error This file must be compiled with ARC.
    #endif
    
  • Перейдите к методу, который используется для создания изображений, используя следующую функцию:

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

    Объявить _ciContext следующим образом:

    • В файле .h объявите:

      @property (strong, nonatomic)   CIContext* ciContext;
      
    • В вашем методе создайте контекст:

      EAGLContext *myEAGLContext = [[EAGLContext alloc]
              initWithAPI:kEAGLRenderingAPIOpenGLES2];
      _ciContext = [CIContext contextWithEAGLContext:myEAGLContext      options:nil];
      
    • Используйте _ciContext для создания изображений.

    • Напишите следующий метод в том же файле:

       -(void)dealloc
       {
          [super dealloc];
          [EAGLContext setCurrentContext:nil];
       }
      

Ответ 3

Включение или выключение ARC - это настройка уровня проекта, если вам нужен код, который работает в обоих режимах, вам нужно использовать

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