#iphone #release #nsdata
#iPhone #выпуск #nsdata
Вопрос:
-(void) func1: (NSData*) somedata
{
//Processing somedata ....
[somedata release]; //is it necessay?
}
Комментарии:
1. Нет никакого возможного способа узнать, необходим ли выпуск в этом сценарии.
2. Вам необходимо предоставить больше информации. Из вашего фрагмента кода невозможно узнать, как / когда / происходит ли владение
somedata
. Рассмотрите возможность редактирования вашего вопроса и публикации кода, в котором вы получаете экземплярNSData *
и как вы его передаете-func1:
.
Ответ №1:
Вы не должны освобождать somedata
внутри своего метода.
NSData *somedata = [[NSData alloc] init];
func1(somedata);
[somedata release];
Предположения:
- func1 выполняется в том же потоке
Комментарии:
1. Как первоначальный владелец Somedata узнает, когда это не нужно. Некоторые данные будут переданы в другую функцию или другой объект.
2. Что, если someData получены из какой-либо сложной функции делегирования и получены как из функции обратного вызова. Нет способа поместить [somedata release] в те функции делегирования, которые были созданы или ожидались.
Ответ №2:
В этом случае нет, вы не должны освобождать свой объект. Вы не являетесь «владельцем». Как правило, вам нужно освободить объект после завершения работы с ним, только если:
- Вы выделили его через
[MyClass alloc]
, как в[[MyClass alloc] init]
или[[MyClass alloc] initWithFoo:foo bar:baz]
. - Вы получили копию через
[someObject copy]
или[someObject mutableCopy]
. - Вы сохраняли его раньше.
Ответ №3:
Вам следует рассмотреть возможность его освобождения, если вы сохраняете его в этом случае. Но я не уверен, потому что ваш вопрос не дает никакого представления о том, требуется ли выпуск или нет. Но, как правило, у вас будут release
возражения, если вы станете владельцем этого.
Комментарии:
1. Возможно, я соглашаюсь с этим, потому что вы получаете доступ к someData. Первоначальный владелец не знает, закончили ли вы с someData. Только вы знаете, что someData завершена и не нужна.