iOS target-c возвращает доступность / объем объекта - PullRequest
2 голосов
/ 02 февраля 2011

Я прочитал документацию Apple, чтобы утверждать, что я правильно управлял памятью, но возникли некоторые вопросы.

Вопрос 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.

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

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

Вопрос 2:

Это касается доступности объектов с автоматическим освобождением:

Пример кода:

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];

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

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

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

Технически это правильно, когда вы отпускаете myString после его использования. Однако, если вы следуете руководству Apple по именованию методов ( настоятельно рекомендуется), это явно неверно:

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

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

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

Автоматически освобожденные объекты будут активны до тех пор, пока не будет истощен ближайший пул автоматического освобождения, см. Бассейны автоматического освобождения :

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

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

3 голосов
/ 02 февраля 2011

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

вправо

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

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

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

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

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

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

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

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

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

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