2012-06-26 6 views
0

내가이 수업을 객체 그 다음 이니셜 라이저에서 :서브 클래스는

초기화에 따라서이 AdvObject 클래스의

0 내가 가지고

@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

+ +'alloc '에 +1. 이것이 클래스 클러스터가 작동하는 방법입니다. –

답변

2

또는이 전체 패턴이 지나치게 영리한 것으로 회피하고 전달 된 매개 변수에 따라 BasicObject 또는 AdvObject을 반환하는 클래스 팩터 리 메서드를 만들 수 있습니다.

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

     _propertyOne = propertyOne; 
     _propertyTwo = propertyTwo; 
    } 

    return self; 
} 

실제로 ARC와 함께이 시도하지 않은 당신이주의 깊게을 테스트해야 것, 그래서 아래 그림과 같이

+0

클래스 팩토리? 나는 두 가지 클래스가 아닌 많은 객체를 가지고있다. (나는이 문제를 단순화시켰다.) 그것에 대해 좀 더 말해 줄 수 있어요? 내가 아는 한 많은 객체를 생성해야하는 추상 클래스를 생성합니다. 그러나 나는 객관적으로 이것을 어떻게 수행해야하는지 정말로 모른다. 나는 iOS에서와 같은 해결책이 있는지 모른다. – Kuba

+0

iOS에만 국한된 것이 아니라 '+ (id) objectForParameter : (NSString *) selector;'와 같은 클래스 메소드입니다. 내부에서는 선택기가 나타내는 모든 종류의 객체를 만들고 반환합니다. 물론 "선택자"는 필요한만큼 복잡해질 수 있습니다 ... 예를 들어, 사전입니다. 메서드의 반환 값이 기본 클래스이거나 맨손 ID 대신 프로토콜이있는 id 인 경우에도 호출자는 더 쉬울 것입니다. 그러나 세부 사항입니다. –

+0

고마워요! 매우 도움이됩니다. – Kuba

0

귀하의 init... 방법은 다른 몇 가지 작업을 수행해야합니다.