В Objective-C, что происходит с исходным объектом, когда метод init устанавливает себя? - PullRequest
1 голос
/ 10 августа 2010

У меня есть три класса Objective-C:

@interface ClassA : NSObject{
     IBOutlet id<ClassAProtocol>delegate
     //other instance variables
}

//methods
@end

@interface ClassB : ClassA{
     //instance variables
}

//methods
@end

@interface ClassC : ClassA{
     //instance variables
}

//methods
@end

Моя цель заключается в том, чтобы при вызове экземпляра ClassA в коде или InterfaceBuilder фактически создавался экземпляр ClassB или ClassC. Будет ли это ClassB или ClassC, зависит от возвращаемого значения метода в ClassAProtocol, реализованного объектом delegate.

@implementation ClassA

static BOOL _initFromSubclass = NO;

-(id)init{
     if(_initFromSubclass){
          _initFromSubclass = NO;
          self = [super init];
     }else {
          _initFromSubclass = YES;
          if([delegate shouldInitClassB]){
                self = [[ClassB alloc] init];
          }else{
                self = [[ClassC alloc] init];
          }
     }

     return self;
}

//other methods
@end

Это не работает так, как я хотел, потому что при вызове инициализации делегат (установленный в Интерфейсном Разработчике) все еще равен нулю, и поэтому созданный объект всегда ClassC. Кроме того, сначала создается объект ClassA, затем при его вызове init создается новый объект ClassC с другим адресом памяти, и объект ClassA не освобождается. У меня три вопроса:

1) Что происходит с исходным ClassA объектом? (Я думаю, что это утечка, но я хочу знать).

2) Как избежать утечки?

3) Как мне добиться того, чего я на самом деле хочу? Ко времени установки делегата (скажем, в методе awakeFromNib) уже слишком поздно для сброса объекта.

1 Ответ

3 голосов
/ 10 августа 2010
  1. Да, я думаю, что это будет утечка, потому что у него есть счет сохранения +1 после alloc, но ничто не выпустит его.

  2. Вы можетеиспользуйте [self release] перед переназначением значения self.Некоторые утверждают, что это должно быть [self dealloc] напрямую, но я лично предпочитаю первое.

  3. Объекты, экземпляры которых созданы из перьев, отправляют initWithCoder: сообщений, я думаю, поэтому переопределите это вместо init.Хотя в данный момент я все еще не уверен, будет ли установлена ​​delegate.

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