Эффективное объявление и освобождение объектов на уровне объекта или локально для метода? - PullRequest
1 голос
/ 12 октября 2009

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

@interface
...
ViewMgmtAppDelegate : NSObject <UIApplicationDelegate> {
Obj *obj1;
...
}
@end

@implementation
- (void)applicationDidFinishLaunching:(UIApplication *)application {
obj1 = [Obj alloc];
[window addSubview:obj1]; 
...
}
- (void)dealloc {
[obj1 release];
...
}
@end

Вместо этого:

@interface
...
ViewMgmtAppDelegate : NSObject <UIApplicationDelegate> {
...
}
@end

@implementation
- (void)applicationDidFinishLaunching:(UIApplication *)application {
Obj obj1 = [Obj alloc];
[window addSubview:obj1]; 
[obj1 release];
...
}
- (void)dealloc {
...
}
@end

Является ли в любом случае более эффективным?

Любая помощь приветствуется //:)

Ответы [ 3 ]

1 голос
/ 12 октября 2009

Я предполагаю, что вы спрашиваете, следует ли вам освобождать объект сразу после addSubview или через dealloc.

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

Когда window завершается с ним, и он освобождает объект, который будет освобожден, если ни один другой объект не имеет ссылки на него.

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

Если вам это не нужно, отпустите прямо сейчас.

Кстати, правильный способ создания и экземпляра заключается в вызове:

Obj * o = [[Object alloc] init]

Alloc выделяет память, init (или любой другой метод init ...) инициализирует объект (я считаю).

1 голос
/ 12 октября 2009

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

1 голос
/ 12 октября 2009

Вы бы использовали свой первый пример на тот случай, если ваш obj1 будет использован после завершения загрузки представления. Например, после события щелчка.

Второй пример будет использован, если это не так. Поэтому Obj1 больше не нужен после релиза и не требует использования оперативной памяти iPhone.

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