У меня есть классы:подклассов и "продвигать" объекты
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 ? (это нуль). Что я делаю неправильно? Это правильный дизайн?
Вы должны почти никогда, НИКОГДА не возвращайте в инициализатор нечто иное, чем 'self' или' nil'. Он отправляет ARC в адскую дыру, а код, на который ссылается, забвенен. Многие, многие часы были потрачены на отладку плохо написанного кода, подобного выше. Если вам нужно вернуть объект другого класса, сделайте это в '+ alloc'. –
Спасибо, я запомню это. Но '+ alloc', я думаю, не решение для меня. У меня есть объект, и если этот объект удовлетворяет условиям, он должен стать другим объектом. Как это сделать? – Kuba
+1 для '+ alloc'. Так кластеры классов работают. –