zoukankan      html  css  js  c++  java
  • ObjectiveC 的Compiler Directives

    Objective-C 中使用@来表示其对C语言的扩展,由编译器提供支持,也叫做compiler directives,比如@interface, @implementation等,下面一一介绍:

    @interface

    相当于类的声明,像是C++中.h文件中包含的类声明信息。跟Java中的interface是不一样的。interface file就是.h文件。在声明一个新类时,可以注意一下信息:

    1. 使用@public @protected @private来控制变量或者方法是否对外可见;
    2. 使用 ‘+’ 修饰的方法是 method for class(类似于C++ 的static method),只能使用类来调用,不能用对象调用;
    3. 使用 '-' 修饰的方法是 method for object,只能用用对象调用,不能用类调用;
    4. 方法声明的格式是:+/-(return type) method_name[:(parametor type) para_name]*;
    5. 方法声明应该写在{}的外面,而不是里面;
    6. instant variable写在{}的里面;

    @implementation

    相当于类的实现,像是C++中cpp文件中类方法的实现那部分。

    下面是一个例子:

    @protocol

    Objective-C中的protocol像是Java中的interface,只有声明,没有实现,一个类可以实现多个protocol。

    @class

    @class是对#import的补充,"Import" links the header file it contains. Everything in the header, including property definitions, method declarations and any imports in the header are made available. Import provides the actual definitions to the linker.

    相比之下@class只是告诉linker不要抱怨某个类没有定义,可以认为它是一个约定:约定你会在另外一个地方提供定义。@class主要用来避免循环import,比如两个interface 文件A和B, A的定义需要B,B的定义需要A,而在两个文件中,就可以一个文件用import,另外一个用@class。下面来总结一下import和@class的区别和联系:

    • import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
    • 在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
    • 在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
    • 如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

    所以,一般来说,@class是放在interface file中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

    下面几个不常用,也没找到很好的文章介绍它们,所以暂时先不介绍,之后再补充

    @interface_category

    @interface_extension

    @compatibility_alias

    @implementation_category

  • 相关阅读:
    sqoop常用命令三 ---- import导入 与export 覆盖更新,常见问题总结
    Sqoop 数据导出:全量、增量、更新
    idea 安装热部署插件
    Python学习之turtle绘图篇
    使用python自动画一只小猪佩奇(源码)
    Python turtle安装和使用教程
    PYCHARM三方库安装方法
    Impala编译部署-3
    SSLv3 SSLContext not available Tomcat
    SSLv3 SSLContext not available Tomcat
  • 原文地址:https://www.cnblogs.com/whyandinside/p/2934979.html
Copyright © 2011-2022 走看看