Циркулярные ссылки и предупреждения, вызванные предварительными объявлениями в объекте C - PullRequest
1 голос
/ 31 марта 2011

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

ClassA.h

#import "ClassB.h"

@interface ClassA : NSObject {
    ClassB *class_b;
}
@end

ClassB.h

@class ClassA;

@interface ClassB : NSObject {
     ClassA *class_a;

}

@end

ClassB.m

#import "ClassB.h"


@implementation ClassB

-(void)method{
}
- (id)init
{
    (self = [super init]);
    class_a = [[ClassA alloc] init];
    return self;
}


@end

Я получаю следующее предупреждение:

ClassB.m:13: warning: receiver 'ClassA' is a forward class and corresponding @interface may not exist

Ответы [ 3 ]

7 голосов
/ 31 марта 2011

В ClassB.m нужно #import "ClassA.h".Форвардное объявление @class предназначено только для заголовочного файла.

0 голосов
/ 31 марта 2011

В заголовках не используйте import / include, но используйте директиву @class. По сути, это говорит о том, что «где-то определен класс с именем X»

0 голосов
/ 31 марта 2011

Заголовки должны знать только о существовании ClassA и ClassB, поэтому работает предварительное объявление.

Однако при реализации им нужно знать больше о другом классе. Таким образом, в файлах реализации вам нужно #import другого класса. У вас нет проблемы, поскольку реализация одного класса должна знать только интерфейс другого,

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