• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Objective-C的CompilerDirectives

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Objective-C桥接模式--简单实用和说明发布时间:2022-07-12
下一篇:
Objective-C中的self与LLVMClang新引入的instancetype发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap