2012-06-26 2 views
0

У меня есть классы:подклассов и "продвигать" объекты

BasicObject : NSObject 

AdvObject : BasicObject 

в другом классе я сделать экземпляр по:

BasicObject *bObj = [[BasicObject alloc] initWithSomething:propertyOne andSomethingElse:propertyTwo]; 

BasicObject имеют два свойства:

@interface BasicObject : NSObject 

-(id)initWithSomething:propertyOne andSomethingElse:propertyTwo; 

@property (strong,nonatomic) NSString* propertyOne; 
@property (strong,nonatomic) NSArray* propertyTwo; 

И затем в инициализаторе:

-(id)initWithSomething:propertyOne andSomethingElse:propertyTwo 
{ 
    if (self = [super init]) 
    { 
     _propertyOne = propertyOne; 
     _propertyTwo = propertyTwo; 

     if(!propertyTwo) //this is not valid condition i know, not important here 
      { 
      AdvObject *aObj = [[AdvObject alloc] initWithBasic:self]; //here it what i'm more concern about 
      return aObj; 
      } 
    } 

    return self; 
} 

Так что в классе AdvObject в инициализаторе я есть:

@implementation AdvObject 

@synthesize basics = _basics; 


-(id)initWithBasic:(BasicObject *)bObj 
{ 
    if(self = [super init]) { 
     _basics = bObj; 
    } 

    return self; 
} 

И после этого, когда я вернуть этот объект, конечно, у меня есть object.basics правильно заполнены, но почему я не могу получить доступ к object.propertyOne ? (это нуль). Что я делаю неправильно? Это правильный дизайн?

+2

Вы должны почти никогда, НИКОГДА не возвращайте в инициализатор нечто иное, чем 'self' или' nil'. Он отправляет ARC в адскую дыру, а код, на который ссылается, забвенен. Многие, многие часы были потрачены на отладку плохо написанного кода, подобного выше. Если вам нужно вернуть объект другого класса, сделайте это в '+ alloc'. –

+0

Спасибо, я запомню это. Но '+ alloc', я думаю, не решение для меня. У меня есть объект, и если этот объект удовлетворяет условиям, он должен стать другим объектом. Как это сделать? – Kuba

+0

+1 для '+ alloc'. Так кластеры классов работают. –

ответ

2

Или вы можете избежать этого всего шаблона как чрезмерно умного и создать фабричный метод класса, который возвращает либо BasicObject, либо AdvObject в зависимости от параметров, которые были переданы ему.

+0

класс завод? У меня много объектов не только двух классов (я упрощаю проблему для вопроса). Не могли бы вы рассказать мне еще об этом? Насколько я понимаю, я создал абстрактный класс, который должен создать много объектов. Но я действительно не знаю, как это сделать в цель-c. Я не знаю, что в iOS есть такое решение. – Kuba

+0

Это не что-то особенное для iOS, просто метод класса, такой как '+ (id) objectForParameter: (NSString *) selector;'. Внутри он создает и возвращает любой тип объекта, который указывает селектор. Конечно, «селектор» может быть настолько сложным, насколько вам нужен ... например, словарь. Также было бы проще, если бы возвращаемое значение метода было базовым классом или идентификатором с протоколом вместо голого идентификатора, но это детали. –

+0

Спасибо! Это очень полезно. – Kuba

0

Ваш метод init... должен был бы сделать пару вещей по-разному, как показано ниже:

- (id)initWithSomething:propertyOne andSomethingElse:propertyTwo 
{ 
    if (self = [super init]) 
    { 
     if (!propertyTwo) 
     { 
      self = [[AdvObject alloc] initWithBasic:self]; 
     } 

     _propertyOne = propertyOne; 
     _propertyTwo = propertyTwo; 
    } 

    return self; 
} 

Я на самом деле не пробовал это с ARC, так что вам нужно, чтобы проверить это тщательно.

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