2014-02-21 4 views
0

내가 다음을 수행하는 데 사용할 수있는 객관적인 C 마법 있습니까 : 형제 속성

내가 두 가지 속성 myObj로 A와 otherObj B.

이제와 클래스 푸,이 말은 ... myObj로의 클래스 구현 파일 (하는 .m)에서

는 (A) I는 "부모"클래스 푸에가 "형제"속성 "otherObj B"의 에 액세스하려면.

액세스 형제 속성 도움을 목표 C에서 이와 유사한 것이 있습니다 :

self.ParentClass.b는; ? 또는 self.OwningClass.b; ?

나는 대회가의 초기화 동안 A와 B refence를 전달하는 아마 알고,하지만 난 지름길이 있다면

그냥 궁금 많은 사용자 정의 initalisers을 만들어야하고 싶지 않다. 당신이

@interface A : NSObject 
@property A 
@end 

@interface B : NSObject 
@property B 
@end 

이있는 경우

@interface Foo : NSObject 
    @property A 
    @property B 
@end 

@interface A : NSObject 
    @property B 
@end 

@implementation A : NSObject 
    self.B = self.parent.B; 
@end 

감사합니다,

+0

글쎄, 당신은 두 속성과 상태를 추적하고 양쪽 구현 파일에서 그 싱글 톤을 참조하는 싱글 톤 디자인 패러다임을 이용할 수 있습니다. – ArtSabintsev

+0

사용자 지정 초기화 프로그램을 만들지 않으려는 경우 클래스를 만들 때 속성을 설정할 수 있습니다. – Tim

+0

A와 B는 같은 부모를 갖지 않습니다. 그래서 이것은 작동하지 않습니다 ... –

답변

1

"부모"또는 "소유자"개념 (이론적으로 객체가 여러 객체에서 유지 관리되는 강력한 참조를 가질 수 있기 때문에 큰 개념은 없습니다. 하지만 그냥 자신의 parent 부동산 추가 : 따라서

을 고려 :

@interface Foo : NSObject 

@property (nonatomic, strong) A *a; 
@property (nonatomic, strong) B *b; 

@end 

@interface A : NSObject 

@property (nonatomic, weak) Foo *parent; 

- (id)initWithParent:(Foo *)foo; 

@end 

@interface B : NSObject 

@property (nonatomic, weak) Foo *parent; 

- (id)initWithParent:(Foo *)foo; 

@end 

그래서, Fooweak 참조를 유지 AB 객체 (따라서 strong 참조), 그리고 AB의 인스턴스를 소유 부모에게. 유의 참조 사이클 (a.k.a. 보유 사이클)을 피하기 위해 부모에 대한 참조는 매우 중요합니다. A에 나는 그것의 형제, B에 대한 액세스 권한을 얻을 수있는 방법을 보여 someRandomMethod을 가지고

@implementation Foo 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     _a = [[A alloc] initWithParent:self]; 
     _b = [[B alloc] initWithParent:self]; 
    } 
    return self; 
} 

@end 

@implementation A 

- (id)initWithParent:(Foo *)foo 
{ 
    self = [super init]; 
    if (self) { 
     _parent = foo; 
    } 
    return self; 
} 

- (void)someRandomMethod 
{ 
    B *sibling = self.parent.b; 

    // now do whatever you want with your reference to the sibling object 
} 

@end 

@implementation B 

- (id)initWithParent:(Foo *)foo 
{ 
    self = [super init]; 
    if (self) { 
     _parent = foo; 
    } 
    return self; 
} 

@end 

주의 사항 :이 클래스의

구현은 다음과 같을 수 있습니다. B에서 A까지 동일한 작업을 수행 할 수 있습니다.

나만의 맞춤형 init 메서드를 작성하고 싶지는 않다고 생각하지만 올바른 방법입니다. 또는 기본 init 메서드를 호출하고 하위 개체의 parent 속성을 수동으로 설정하면됩니다.:

+0

고마워요, 제 친구 – Woodstock

3

는 A는 그 반대의 경우도 마찬가지 B를 알고있는 방법이 없습니다. 당신이 말했듯이 : 당신은 당신이 이제까지 당신이 싱글 톤 패턴을 사용할 수있는 인스턴스 하나와 B의 인스턴스를 경우에 대한 참조를

을 통과해야합니다. 그러나 추가 종속성을 가져오고 코드 재사용을 줄입니다. 그래서 그것이 작동하는 동안, 내가 권장할만한 방법이 아닙니다.

+0

답변을 주셔서 감사합니다. 질문을 잘하면 더 명확하게 편집했습니다. 나는 'self.parent'호출과 같은 속성 구현 내부에서 주어진 속성의 부모를 참조하는 쉬운 방법이 있는지 묻고 싶습니다. – Woodstock

+0

당신은 슈퍼를 의미합니까? –

+0

A와 B는 같은 부모를 갖지 않습니다. –