2011-02-05 3 views
2

Здравствуйте, я не полностью понимаю вызов функции автоопределения в obj-C.Objective C autorelease

@interface A{ 
id obj; 
} 

@implementation A 

-(void)myMethod; 
{ 
obj = [BaseObj newObj];   //where newObj is a method like :[[[BaseObj alloc]init]autorelease]; 
} 

-(void)anotherMehtod; 
{ 
[obj someMeth];      //this sometimes gives me EXC_BAD_ACCESS 
} 

@end 

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

+4

Примечание стороны: правила в какао является то, что, если имя метода начинается с '' new', copy', 'retain' или' alloc', вызывающий абонент должен отправить 'release' или' autorelease', чтобы сбалансировать его. Таким образом, метод с именем 'newObj' не должен авторейтировать собственный результат. –

ответ

0

Да. Правило: если вы сохраните объект, вы также несете ответственность за его выпуск в iOS.

4

Если вы являетесь владельцем объекта - это ваша ответственность - освободить его.

Вы становитесь владельцем объекта, если вы сделали по крайней мере, одно из следующих действий:

  • инстанцирован через alloc
  • прошел retain
  • прошел copy

Для более подробности читайте Object Ownership and Disposal

+0

Вы забыли 'new', поэтому, если' + newObj' будет следовать рекомендациям, объект не должен быть автоматически выпущен в первую очередь. –

+1

@ Georg Fritzsche: 'new' - это то же самое, что' [[aClass alloc] init]; '. Поэтому, говоря о 'alloc', есть только enaugh. '+ newObj' из описания уже содержит отложенный' release' pass: 'alloc] init] autorelease]', поэтому нет необходимости в дополнительной 'release' здесь –

+0

И, конечно,' obj' будет уже выпущен в 'anotherMehtod', поэтому результат EXC_BAD_ACCESS –

0

Как и все другие статические методы в Obj-C [BaseObj newObj] существует только в вашем методе -(void)myMethod в конце этого метода (примерно) obj получает сообщение -release из пула авторефератов.

Если вы хотите сохранить этот объект - используйте [[BaseObj newObj] retain] или [BaseObj alloc] init] и отпустите его в -dealloc или когда вам нужно.

Например:

@interface A{ 
    id obj; 
} 

@implementation A 

-(void)myMethod 
{ 
    [obj autorelease]; 
    obj = [[BaseObj newObj] retain];   //where newObj is a method like :[[[BaseObj alloc]init]autorelease]; 
} 

-(void)anotherMehtod; 
{ 
    [obj someMeth];      //this sometimes gives me EXC_BAD_ACCESS 
} 

-(void)dealloc 
{ 
    [obj release]; 
    [super dealloc]; 
} 

@end 

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

  • Нет связанных вопросов^_^