Циклическая ссылка - протоколы и подклассы - PullRequest
3 голосов
/ 28 января 2010

Я получаю некоторые проблемы с циклическими ссылками (я думаю) между несколькими классами, которым требуются импортированные заголовки из-за подклассов или определений протокола. Я могу объяснить, почему все так устроено, но я не уверен, что это важно. По сути, эти классы управляют взаимными отношениями данных со многими.

Макет такой:
Класс A импортирует класс B, поскольку он является делегатом класса B и нуждается в определении протокола.
Класс B импортирует класс C, потому что это подкласс класса C.
Класс C импортирует класс A, поскольку он является делегатом класса A и нуждается в определении протокола.

Вот пример кода, который иллюстрирует проблему. Я получаю следующие ошибки: В классе A - «Не могу найти определение протокола для Class_B_Delegate». В классе B - «Не удается найти объявление интерфейса для класса C - суперкласс класса B.» В классе C - «Не удается найти определение протокола для Class_A_Delegate».

Заголовок класса A:

#import <Foundation/Foundation.h>
#import "Class_B.h"

@protocol Class_A_Delegate
@end

@interface Class_A : NSObject <Class_B_Delegate> {
}

@end

Заголовок класса B:

#import <Foundation/Foundation.h>
#import "Class_C.h"

@protocol Class_B_Delegate <NSObject>
@end

@interface Class_B : Class_C {
}

@end

Заголовок класса C:

#import <Foundation/Foundation.h>
#import "Class_A.h"

@interface Class_C : NSObject <Class_A_Delegate> {
}

@end

Ответы [ 4 ]

3 голосов
/ 28 января 2010

Вы можете использовать предварительные объявления, чтобы разорвать цикл зависимости. См. Ссылка на другие классы в Руководстве по программированию Objective-C .

Таким образом, заголовок класса C должен выглядеть следующим образом:

#import <Foundation/Foundation.h>

@protocol Class_A_Delegate;

@interface Class_C : NSObject <Class_A_Delegate> {
}

@end
0 голосов
/ 13 мая 2011

В итоге я поместил определения протоколов в отдельные заголовочные файлы, и это, похоже, сработало.

0 голосов
/ 28 января 2010

В ответ на предложение я реструктурирую макет - вот макет. Это не помещается в комментарии.

Контроллер вида A управляет списком автомобильных объектов и вызывает контроллер вида B для добавления автомобильного объекта. Когда B заканчивается, он вызывает своего делегата A, чтобы позволить ему теперь добавить автомобильный объект. Теперь у автомобильного объекта может быть много объектов водителя, поэтому, когда B добавляет автомобиль, он может отображать список объектов водителя, используя контроллер представления C, который является подклассом контроллера представления D. D отображает объекты драйвера, аналогично тому, как отображает A автомобильные объекты. C подклассы D, чтобы позволить интерфейс выбора типа. Поскольку D отображает объекты водителя, а водитель может иметь много автомобилей, D вызывает контроллер представления E, который имеет функции, аналогичные C, что позволяет выбирать объекты автомобилей. E является подклассом A.

Надеюсь, это понятно.

0 голосов
/ 28 января 2010

Я бы сказал, что это неправильное расположение, которое вызывает циклические ссылки попытайтесь реструктурировать их, и проблема исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...