2011-02-02 4 views
2

Я прочитал документацию на яблоко, чтобы утверждать, что я правильно занимаюсь управлением памятью, но некоторые поднятые вопросы.Объект объектива-c объектного-c объектива-scope

Вопрос 1:

Они демонстрируют этот фрагмент кода, как неправильно:

in obj implementation: 
- (NSString *)method1 { 
    NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName]; 
    return string; 
} 

... later ... 

NString* myString = [obj method1]; 
NSLog("%@", myString); 
[myString release]; 

Apple Doc:

You own the string returned by alloc, but lose the reference to it before you get a chance to relinquish ownership. Following the memory management rules, this would result in a memory leak, since the caller has no indication that they own the returned object. 

Поскольку я забочусь о отпуская объект, который был выделен ранее , утечки памяти нет, правильно? Что они означают, «теряя ссылку на него»?

Это неправильно только в отношении рекомендаций по управлению памятью яблока (у вызывающего нет указаний на то, что у них есть возвращенный объект), или это также технически неправильно?

Вопрос 2:

Это о autoreleased объектов доступность:

Пример кода:

in obj1 implementation: 
- (NSString *)methodA { 
    NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName]; 
    return [string autorelease]; 
} 

in obj2 implementation: 
- (NSString *)methodB:(NSString *)inputString { 
    NSLog("%@",inputString) 
    //*other call of methods with arg inputString*// 
} 
... later ... 

NString* myString = [obj1 methodA]; 

[obj2 method2:myString]; 

Как далеко (или глубоко), после моих вызовов функций будет объект autorelease возвращаемый obj1 будет быть доступным. Что касается документации Apple, «объекты Autorelease будут доступны в пределах их переменных». Должен ли я сохранить его в какой-то момент?

+0

Эта статья может помочь любому, кто ищет больше объяснений по этому вопросу. http://www.asgteach.com/blog/?p=73 –

ответ

4

Q1: Это неправильно только в отношении рекомендаций по управлению памятью яблока (абонент не имеет никаких признаков того, что они владеют возвращаемый объект) или это тоже технически не так?

Технически это верно, поскольку вы освобождаете myString после его использования. Однако, если вы будете следовать яблоки guidelines for method naming (сильно рекомендуется), это явно не так:

Вы владеете какой-либо объект, который вы создаете. Вы «создаете» объект, используя метод, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy).

method1 не содержит create, alloc, new или copy - таким образом, согласно директиве звонящий не принадлежит объект и не выпускать его.

Q2: Как далеко (или глубоко), после моих вызовов функций будет объект autorelease возвращаемого obj1 будет доступен. Что касается документации Apple, «объекты Autorelease будут доступны в пределах их переменных». Должен ли я сохранить его в какой-то момент?

Auto выпустила объекты будут живы, пока ближайший Autorelease бассейн сливают, см Autorelease Pools:

autorelease бассейн является экземпляром NSAutoreleasePool, что «содержит» другие объекты, которые получили сообщение autorelease ; когда пул авторасчетов освобождается, он отправляет сообщение о выпуске каждому из этих объектов. Объект может быть помещен в пул авторесурсов несколько раз и получает сообщение о выпуске за каждый раз, когда он был помещен в пул. Таким образом, отправка авторекламы вместо отпускания объекту продлевает срок жизни этого объекта по крайней мере до тех пор, пока сам пул не будет выпущен (объект может выжить дольше, если он сохраняется в промежутке времени).
...
Комплект приложений автоматически создает пул в начале цикла событий (или итерации цикла событий), например, событие мыши и освобождает его в конце, поэтому ваш код обычно не имеет беспокоиться о них. Есть три случая, хотя, где вы можете использовать свои собственные бассейны autorelease:
...

Так что, если вам нужны ваши экземпляры, чтобы остаться в живых после того, как соответствующий autorelease бассейн был осушен, брать на себя ответственность, сохраняя их , В противном случае вы обычно просто позволяете им обрабатываться пулом.

+0

Спасибо за качество ответа! – Kami

3

Поскольку я забочусь о выпуске ранее выделенного объекта, утечки памяти нет, правильно?

право

Что они означают "потерять ссылку на него"?

У вас нет указателей на объект, чтобы объект не мог быть доступен в вашей программе.

Это неправильно только в отношении рекомендаций по управлению памятью яблока (у вызывающего нет указания на то, что у них есть возвращенный объект), или это также технически неправильно?

также правильный. статический анализатор будет слишком сильно плакать

Как далеко (или глубоко) после вызовов моих функций будет доступен объект автообновления, возвращенный obj1. Что касается документации Apple, «объекты Autorelease будут доступны в пределах их переменных». Должен ли я сохранить его в какой-то момент?

Это немного сложнее. пулы автоопределения сложены друг на друга потоком. поэтому вы должны создать его при вводе нити или новой итерации цикла событий, а также почему рекомендуется создавать их явно при выполнении больших операций, которые создают множество (автореализованных) распределений.

Наконец, последний пул в стеке (для потока) уничтожается в конце итерации цикла выполнения.

Если объект создан в пуле автоопределений, который вы создаете явно, то вы должны сохранить его, чтобы использовать его за время существования пула, в котором он был создан.

Аналогичным образом, вы должны официально сохранить/скопировать при передаче в другие потоки. Обычно это происходит немедленно - вы просто создаете копию или сохраняете формальные аргументы при вводе реализации вторичного потока.

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