• 头文件导入@class(四)


    头文件导入@class

    当两个以上的类声明中相互import对方,形成一个循环时,会造成循环导入头文件,导致这些类的声明都找不到引入的那个类,出现死循环。此时的import已经失效,include也已经失效,此时,就要用到@class对这个循环进行切断,切断后,在.m文件中再用import来引入想要引入的类。

    Girl.h

    //#import <Foundation/Foundation.h>

    //#import "Boy.h"

    @class Boy;

    //如果发生循环引用问题,首先想到的就是@class解决。

    //@class是使用在.h文件的。

    //如果使用了@class,就要在.m中#import

     

    //@class什么也没做,只是告诉下面有Boy这个类型。

     

    @interface Girl : NSObject{

        Boy *_boyFriend;

    }

     

    @end

    Girl.m

    #import "Girl.h"

    #import "Boy.h"

    @implementation Girl

    @end

    Boy.h

    //#import <Foundation/Foundation.h>

    //#import "Girl.h"

     

    @class Girl;

     

    //@class什么也没做,只是告诉下面有Girl这个类型。

     

    @interface Boy : NSObject{

       

        Girl *_girlFriend;

    }

     

    @end

    Boy.m

    #import "Boy.h"

     

    #import "Girl.h"

     

    @implementation Boy

     

    @end

    main.m

    #import <Foundation/Foundation.h>

    #import <Foundation/Foundation.h>

    //#include和#import功能一样,都是导入头文件

    //区别是:#include单纯导入头文件,这个时候,如果重复导入,头文件就被导入多份

    //#import在导入之前,会检查之前是否导入过,如果导入过,不再编译。防止重复导入。

     

    //@class,防止循环导入

    //#include<Foundation/Foundation.h>

    //#include<Foundation/Foundation.h>

    int main(int argc, const char * argv[])

    {

     

        @autoreleasepool {

           

            // insert code here...

            NSLog(@"Hello, World!");

        }

        return 0;

    }

    上面的例子,就是在Girl声明时,需要用到Boy类,此时就要引入Boy类。Boy在声明的时候,也用到Girl类,此时,就要引入Girl类,这就造成了两者之间相互引入,导致编译不通过,报错为:找不到对应的类。此时就要用到@class来阻断这个循环引入。然后分别在Boy.m和Girl.m两个文件中分别导入Girl.h和Boy.h类。

  • 相关阅读:
    python依赖包整体迁移方法
    ubuntu关于ssh协议登录问题
    k8s部署02-----kubeadm部署k8s
    k8s部署01-----what is k8s?
    兼容到ie10的js文件导出、下载到本地
    webstorm减少内存占用
    foxmail占cpu 100%解决办法
    原生js返回顶部
    js字符串驼峰和下划线互相转换
    element-ui的rules中正则表达式
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5118564.html
Copyright © 2020-2023  润新知