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
Ответы
Ответ 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