Есть ли способ использовать определение протокола другого заголовочного файла? - PullRequest
1 голос
/ 01 сентября 2009

У меня проблемы с использованием стороннего протокола в Objective-C.

Есть ли другое решение, кроме добавления дополнительных протоколов?


Пример:

Class1.h

#import "Class2.h"

@protocol Class1Delegate <NSObject>
    @required
    -(NSArray*) someMethod;
@end

@interface Class1 : NSObject
{
     Class2 *variable;

} ...

Class2.h

#import "Class1.h"
@interface Class2: NSObject {
    id <Class1Delegate> delegate;
}
@property (nonatomic,assign) id <Class1Delegate> delegate;

Ошибка:

ошибка: не удается найти объявление протокола для 'Class1Delegate'

Ответы [ 2 ]

2 голосов
/ 01 сентября 2009

Это должно работать так, как вы это описали. Вы уверены, что больше ничего не происходит?

Есть ли Class1.h #import Class2.h?

Обновление:

Если Class1.h также импортирует Class2.h, то у вас есть цикл зависимости заголовка:

Class1.h импортирует Class2.h
Class2.h импортирует Class1.h

Вот проблема:

  1. Компилятор начинает работать на Class1.h
  2. Он встречается в строке: `#import" Class2.h "
  3. Он открывает Class2.h и начинает там работать
  4. Находит строку: #import Class1.h
  5. Он игнорирует эту строку (чтобы избежать бесконечного цикла)
  6. Выдает ошибку, потому что Class2.h требует вещи из Class1.h, которые еще не скомпилированы

То, как вы решите, действительно зависит от вас, но этот тип петли является признаком того, что с вашим дизайном что-то не так. Быстрое исправление может быть следующим:

Class1.h

@protocol Class1Delegate <NSObject>
@required
-(NSArray*) someMethod;
@end

#import "Class2.h" // moved here to avoid a cyclic dependency

@interface Class1 : NSObject
...

Вы просто перемещаете #import строку после протокола, который был объявлен.

1 голос
/ 01 сентября 2009

Это должно работать нормально, так как этот шаблон используется постоянно (например, UIScrollViewDelegate определен в UIScrollView.h, но вы можете #import использовать его и использовать в объявлении класса контроллера представления).

Из любопытства, реализует ли Class2.m требуемый someMethod метод?

Можем ли мы увидеть больше ошибок?

P.S. Вы не должны удерживать делегата. Ваша директива @property должна быть (nonatomic, assign). См. Право собственности на делегатов, наблюдателей и цели .

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