两个 class 通过导入它们的头文件(通过 #import )相互访问会导致错误

Two class access each other by importing their head file(via #import ) causes error

两个 class 通过导入它们的头文件(通过 #import )相互访问导致错误?

如果需要访问其他 classes ,总是建议我在头文件中使用 @class className 。但是我很少知道我为什么要这样做的任何原则。下面有一个小示例,它会触发类似“UNKnown type name 'xxxClass'”这样的错误。这是否意味着“#import”没有在此处复制代码?如果不是,为什么它无法检测到“xxxClass”

我觉得这不是循环retain的问题,但是报错的原理是什么?

============================  Person   ===============================

Person.h
  #import <Foundation/Foundation.h>
  #import "Dog.h"
 //@class Dog;
 @interface Person : NSObject
 @property (nonatomic, strong) Dog *dog;   //Error  :UNKnown type name ‘Dog'
 @end



Person.m
 #import "Person.h"
 @implementation Person
 - (void)dealloc{ NSLog(@"Person--dealloc");}
 @end

 ============================  Dog   ===============================
 Dog.h
 #import <Foundation/Foundation.h>
 #import "Person.h"
 @interface Dog : NSObject
 @property (nonatomic, weak) Person *person;  //Error:UNKnown type name‘Person'
 @end



Dog.m
 #import "Dog.h"
 @implementation Dog

 - (void)dealloc{ NSLog(@"Dog--dealloc");}
 @end


============================  main   ===============================
 main.m
 #import <Foundation/Foundation.h>
 #import "Person.h"
 #import "Dog.h"
 int main()
 {   
   Person *p = [[Person alloc] init];
   Dog *d = [[Dog alloc] init];

   p.dog = d;
   d.person = p;

   return 0;
  }

基本上,#import 使编译将指定文件的整个文本放入语句所在的文件中。当您有循环 #import 语句时,编译器会变得混乱并抛出错误。这就是为什么你应该使用 @class 来打破这个循环。

@class Dog 的意思是,当它开始编译时,您告诉编译器它将有这个 class (稍后)并且现在不必 include/compile ,

你必须在 header 中使用 @class , 如果您想从实现(.m 文件)中操作此 object,那么,您可以直接在 .m 文件

中包含 another-classes header 文件 (.h)
//Person.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog;
@end


//Person.m
#import "Person.h"
@implementation Person
- (void)dealloc{ NSLog(@"Person--dealloc");}
@end


//Dog.h
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic, weak) Person *person;
@end

//Dog.m
#import "Dog.h"
// **IF YOU WANT TO HAVE ACCESS TO THE PERSONS OBJECT AND ITS PROPERTIES , INCLUDE ITS HEADER HERE**
@implementation Dog
- (void)dealloc{ NSLog(@"Dog--dealloc");}
@end

main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main()
{   
    Person *p = [[Person alloc] init];
    Dog *d = [[Dog alloc] init];
    p.dog = d;
    d.person = p;

    return 0;
}