Как получить ссылку на объект, который создал экземпляр второго объекта в Objective-C?

У меня есть объект (secondObject), который является экземпляром подкласса NSObject, и внутри secondObject я хочу получить ссылку на объект, где был создан экземпляр secondObject (firstObject).

Пример:

В FirstObject.m (подкласс UIViewController)

    SecondObject *secondObject = [[SecondObject alloc] init];

в SecondObject.m

    @implementation SecondObject
    - (id) init {
        self = [super init];
        NSLog(@"Parent object is of class: %@", [self.parent class]);
    return self;
    }
    @end

Я искал что-то похожее на свойство .parentViewController для viewControllers.

Я исследовал KeyValueCoding, но не смог найти решение.

Обходной путь, который я реализовал, состоял в том, чтобы создать метод initWithParent:(id)parent в secondObject.m, а затем передать себя при создании экземпляра.

в SecondObject.m

    @interface SecondObject ()
    @property id parent;
    @end

    @implementation SecondObject
    - (id) initWithParent:(id)parent {
        self = [super init];
        self.parent = parent;
        NSLog(@"Parent object is of class: %@", [self.parent class]);
        return self;
    }

    @end

А затем создайте экземпляр объекта в fisrtObject.m следующим образом.

    SecondObject *secondObject = [[SecondObject alloc] initWithParent:self];

Есть ли более простой способ сделать это?

С уважением.... Энрике


person eharo2    schedule 07.02.2014    source источник
comment
То, что вы придумали, является правильным способом. Или установите свойство после вызова init. Либо работает.   -  person rmaddy    schedule 07.02.2014


Ответы (2)


Объекты не имеют какого-либо указателя на объект, который их создал.

Ваш метод initWithParent: будет работать, но вы можете подумать о том, почему ваш объект должен знать своего создателя и нет ли лучшего способа выполнить то, что вы пытаетесь выполнить.

Кроме того, вы, вероятно, захотите сделать родительское свойство слабым свойством, иначе вы в конечном итоге создадите циклы сохранения повсюду.

person Chris Flesner    schedule 07.02.2014

Вероятно, это должно быть _parent = parent; в этом методе init, но в остальном в этом нет ничего плохого. На самом деле, насколько я знаю, довольно распространено делать что-то подобное (initWithDelegate: и т.д.)

Однако...

Вероятно, было бы разумно написать @protocol, которому соответствует класс parent, и вместо того, чтобы брать только id, вам нужен объект, соответствующий протоколу.

person nhgrif    schedule 07.02.2014
comment
Это правильный ответ. Делегирование — очень важный шаблон проектирования, который нужно знать. Вы можете прочитать об этом здесь: developer.apple.com/library/ios/documentation/general/ - person D.C.; 07.02.2014
comment
Спасибо, nhgrif... Я реализовал @protocols в другой части проекта. Я воспринял это как вызов, учитывая, что то, что я хочу сделать, концептуально похоже на перемещение делегата id из родительского класса в созданный класс, чтобы получить доступ к «родительским» методам и свойствам делегата. Это часть проекта, который использует CoreText (для нескольких статей-страниц-столбцов) и включает в себя динамическое изменение размера шрифта с помощью жеста сжатия, а синтаксический анализатор и построитель страниц-столбцов находятся в отдельной ветке класса. - person eharo2; 07.02.2014