2013-09-21 4 views
1

Я новичок в Objective-C и пришел к 2 проблемам того же типа уже при освобождении памяти. Вот так:Ошибка объекта Objective-C

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]intit]; 
//^^ NSAutoreleasePool is unavailable: not available in automatic reference counting 

[lord release]; 
//^^ Same error as NSAutoreleasePool 

Я не уверен, почему это не работает, похоже, для других. В любом случае, если бы я мог получить некоторую помощь в этом, это было бы фантастично, спасибо огромное!

+3

[Дайте мне Google, что для вас] (http://bit.ly/1f3LQaZ) –

+1

Ошибка в сообщении об ошибке *** всегда *** работает. –

ответ

2

Нельзя использовать селектор сохранения/освобождения/автоопределения вручную при использовании автоматического подсчета ссылок. Ручной подсчет ссылок был старым способом управления памятью - теперь вы всегда должны использовать ARC и забывать вручную отправлять сообщения «release», потому что они автоматически вставляются компилятором.

NSAutoreleasePool была заменена ж/языковая конструкция уровня @autoreleasepool: https://developer.apple.com/library/ios/documentation/cocoa/conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

Edit: @autoreleasepool Например:

Здесь у вас есть 10000 объектов в памяти до родительского autoreleasepool водостоков:

for(int i = 0; i < 10000; i++){ 
    NSString * s = [NSString alloc] initWithFormat:@"%d",i]; 
} 

При максимальном использовании памяти этот алгоритм имеет в памяти 10000 NSStrings. Тем не менее, рассмотрим следующий вариант:

for(int i = 0; i < 10000; i++){ 
    @autoreleasepool{ 
     NSString * s = [NSString alloc] initWithFormat:@"%d",i]; 
    } 
} 

Таким образом, есть только один NSString в то время, которое будет освобождён в конце каждой итерации.

+0

Хм, я вижу, что я должен делать @autoreleasepool {} , но не могли бы вы привести мне пример? Я смущен тем, как это следует использовать точно. – JeremyF

+1

Обычно вы не должны использовать autoreleasepool вообще. Однако, если у вас есть цикл, в котором вы создаете много ** временных ** объектов, вы должны рассмотреть вопрос о включении тела цикла в блок autoreleasepool. Таким образом, временные объекты освобождаются от каждой итерации, а объем памяти приложений остается умеренным. Но я подчеркиваю, что вам нужно только заботиться об этом, создавая много-много временных объектов. –

+0

Отредактировал свой ответ на примере. –

Смежные вопросы