zoukankan      html  css  js  c++  java
  • iOS #import和@class 区别

    @class和#import相似。

    1.@class用于 forward-class declaration,只能使用@class,

    @class class2
     
    @interface class1
    {
        class2* class2Object;
    }
     
    @end
     
    @interface class2
    {
        class1* class1Object;
    }
    @end

    2.

    class1.h中引入class2.h头文件

    #import "class2.h"
    @interface class1
    {
        class2* class2Object;
    }
     
    @end

    class2.h中引入class1.h头文件

    #import "class1.h"
    @interface class2
    {
        class1* class1Object;
    }
    @end

    这种情况会导致引用死锁,所以应该用forward-class declaration,即@class,如下

    class1.h

    @class class2;
    @interface class1
    {
        class2* class2Object;
    }
     
    @end

    class2.h

    @class class1;
    @interface class2
    {
        class1* class1Object;
    }
    @end

    总结,@class class1只是告诉编译器,class1是一个类,你不要以为class1是个未声明的野种,除此之外,没了。

    但是 #import "class1.h"会告诉编译器,class1这个类中有什么东西,即class1.h中包含的函数和变量。

    所以.h中使用@class绰绰有余,若你有需要创建或访问class1中的函数和变量,则必须使用#import。

    最后给个常见的例子

    @class A;
    
    @protocol MyDelegate <NSObject>
    - (BOOL)f:(A *)a;
    - (void)g:(A *)a;
    @end
    
    @interface A : NSObject
    @end

    协议写在@interface前面,协议使用了类A,又不涉及A中的函数和变量,此时应当在协议前面写上@class A;,否则是会出错的。

  • 相关阅读:
    sqli-labs Less29-Less31
    sqli-labs Less23-Less28a
    sqli-labs Less20-Less22
    sqli-labs Less17--Less19
    sqli-labs Less13-Less16
    为什么选择centos,而不是Dibian、Ubuntu【转】
    sublime 安装常用插件
    Linux常用命令
    在UEFI下安装windows和Ubuntu双系统目前不可行
    nginx 环境搭建(基于linux)
  • 原文地址:https://www.cnblogs.com/chenyg32/p/4485252.html
Copyright © 2011-2022 走看看