2014-02-21 6 views
0

Есть ли цель магии C я могу использовать, чтобы сделать следующее:Родственные свойства в Objective C

Скажем, у меня есть класс Foo, с двумя свойствами myObj A и B. otherObj

Теперь ...

В файле реализации класса (.m) myObj (A) Я хочу получить доступ к , это свойство «sibling» «otherObj B» в «родительском» классе Foo.

Есть ли что-то похожее на это в объективном C, чтобы помочь доступа двойников свойства:

self.ParentClass.b; ? или self.OwningClass.b; ?

Я знаю, что конвенция, вероятно, пройти refence к B во время инициализации А, но я не хочу, чтобы создать много пользовательских initalisers

просто интересно, если там был ярлык.

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

@interface A : NSObject 
    @property B 
@end 

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

Спасибо,

+0

Хорошо, вы можете использовать парадигму дизайна singleton, которая отслеживает как свойства, так и их состояния, и ссылается на то, что singleton в обоих файлах реализации. – ArtSabintsev

+0

Если вы не хотите создавать пользовательский инициализатор, вы можете установить его свойство при создании класса. – Tim

+0

А и 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 

Так, Foo будет владеть экземпляры A и B объектов (таким образом strong ссылок), а также A и B будет поддерживать weak ссылку их родителям. Обратите внимание, что ссылка weak на родителя является критической, чтобы избежать сильных эталонных циклов (циклы сохранения a.k.a.).

Реализация этих классов могут выглядеть следующим образом:

@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 

Обратите внимание, в A У меня есть someRandomMethod, который показывает, как он может получить доступ к его родному брату, B. Вы можете сделать то же самое с B до A.

Я знаю, что вы говорите, что не хотите писать свои собственные методы init, но это правильный способ сделать это. Или просто вызовите метод по умолчанию init и вручную установите свойство parent дочерних объектов, например.:

_a = [[A alloc] init]; 
_a.parent = self; 
_b = [[B alloc] init]; 
_b.parent = self; 
+0

спасибо, мой друг – Woodstock

3

Если у вас есть

@interface A : NSObject 
@property A 
@end 

@interface B : NSObject 
@property B 
@end 

тогда А не имеет возможности узнать, B, и наоборот. Как вы сказали: вы должны передать ссылку

ЕСЛИ вы когда-либо только один экземпляр и один экземпляр B, то вы можете использовать одноэлементный шаблон. Но он вводит дополнительные зависимости и делает код менее многоразовым. поэтому, хотя это может сработать, это не способ, который я бы рекомендовал.

+0

Спасибо за ответ, я редактировал мой вопрос, надеюсь, более ясный. Наверное, я пытаюсь спросить, есть ли простой способ ссылаться на родительский элемент данного свойства внутри реализации свойств, что-то вроде вызова «self.parent»? – Woodstock

+0

Вы имеете в виду супер? –

+0

A и B не имеют одного и того же родителя. –

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