Второе лучше.
Из Руководства по программированию управления памятью :
- Вы владеете любым создаваемым вами объектом.
- Вы «создаете» объект, используя метод, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy).
Так как ваш метод getter не соответствует ни одному из этих критериев, он не должен делать вызывающего пользователя неявным владельцем возвращаемого объекта.Вызывающие должны явно вызывать retain
для возвращаемого значения, если они хотят владеть им.
При этом вам не нужно указывать NSAutoreleasePool
в вашем коде, потому что по умолчанию цикл выполнения уже имеетбассейн.При этом должно хватить следующего:
- (Employee*) getCustomEmployee {
Employee *emp = [[[Employee alloc] init] autorelease];
// do something with emp
return emp;
}
- (void) process {
Employee *emp = [self getCustomEmployee];
// do something with emp
}
Другие авторы говорят, что вам не следует размещать новые объекты в геттерах.Я не согласен с этим.Создание объектов по запросу является хорошей практикой во многих случаях.В частности, когда у вас есть ресурсоемкие объекты, которые, возможно, никогда не потребуется выделять.Вполне допустимо размещать новые объекты в получателе, пока соблюдаются правила владения.
В этом случае, если сотрудник может быть разделен между несколькими вызывающими, тогда вы можете рассмотреть ленивую инициализацию.В следующем коде предполагается, что у вас есть переменная экземпляра (ivar в языке target-c) с именем _employee.
- (Employee*) getCustomEmployee {
@synchronized(self)
if (!_employee) {
_employee = [[Employee alloc] init];
}
}
return _employee;
}
- (void) dealloc {
[_employee release];
}
- (void) process {
Employee *emp = [self getCustomEmployee];
// do something with emp
}
В этом случае владение остается за объектом, который его создал, поэтому он должен освободить памятьв какой-то момент в будущем.Естественное место для освобождения принадлежащих объектов - это когда сам объект освобождается.Когда это произойдет, будет вызван метод dealloc
, и именно здесь мы можем выполнить нашу очистку.