【转】IOS基础:深入理解Objective-c中@class的含义

objective-c中,当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,

如下面代码:

A.h文件

  1. #import "B.h"
  2. @interface A : NSObject {
  3. B *b;
  4. }
  5. @end

为了简单起见:A类是引用类,B类是被引用类,这里先不考虑A类的实现文件。

通常引用一个类有两种办法:

一种是通过#import方式引入;另一种是通过@class引入;

这两种的方式的区别在于:

1、#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息;

2、使用@class方式由于只需要只要被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以需要使用#importl来包含被引用类的头文件;

3、通过上面2点也很容易知道在编译效率上,如果有上百个头文件都#import了同一 个文件,或者这些文件依次被#improt(A->B, B->C,C->D…),一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来 讲,使用@class方式就不会出现这种问题了;

4、对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类,B类的代码:

  1. #import "A.h"
  2. @interface B : NSObject {
  3. A *a;
  4. }
  5. @end

当程序运行时,编译会报错,

当使用@class在两个类相互声明,就不会出现编译报错。

由上可知,@class是放在interface中的,只是在引用一个类,将这个被引用类作为一个类型,在实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类。

如:

  1. #import "A.h"
  2. #import "B.h"
  3. @implementation A
  4. ......

举个例子说明一下。

在ClassA.h中

#import ClassB.h 相当于#include整个.h头文件。如果有很多.m文件#import ClassA.h,那么编译的时候这些文件也会#import ClassB.h增加了没必要的#import,浪费编译时间。在大型软件中,减少.h文件中的include是非常重要的。

如果只是 ClassB 那就没有include ClassB.h。仅需要在需要用到ClassB的.m文件中 #import ClassB.h

那么什么时候可以用呢?

如果ClassA.h中仅需要声明一个ClassB的指针,那么就可以在ClassA.h中声明

@ClassB

...

ClassB *pointer;

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

from:http://www.cnblogs.com/martin1009/archive/2012/06/24/2560218.html

时间: 2024-10-05 03:05:51

【转】IOS基础:深入理解Objective-c中@class的含义的相关文章

iOS基础控件-UINavigationController 中的传值,代理传值,正向传值,反向传值

/* 程序过程: 1,创建一个根视图,一个二级视图 2,根视图 NavigationItem.title = Root  二级视图NavigationItem.title = Second 根视图NavigationItem.rightButton 入栈二级视图 3, 二级视图中创建三个按钮 按钮一  按钮二  按钮三 三个按钮点击时间都是出栈,并把自己的按钮的 titel 赋给 根视图的NavigationItem.title 4,当再次进入二级视图时,判断 根视图的NavigationIte

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

iOS面试必备-iOS基础知识

近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是 所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计 数+1,release代表引用计数-1,当引用计数减为0时

iOS基础面试题3

iOS进阶面试题----多线程部分 前言:欢迎大家评论,给出正确地答案 1.Difference between shallow copy and deep copy?浅复制和深复制的区别?答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身.深层复制:复制引用对象本身.意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的

iOS开发核心语言Objective C —— 全部知识点总结

本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础.建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在開始Objective C语言的学习,假设您遇到问题也能够与我探讨.另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦.能够新浪微博私信?关注极客James,期待与您的共同学习和探讨! ! 由于时间有限,每

IOS基础_Block语法的简单使用

开始学IOS的时候没怎么接触过block语句,在后来用到的越来越多,就不得不学了,刚开始理解比较困难的,然后自己做了一个例子就慢慢理解了,不说废话了,上代码: 正常的简单地申明调用一个block语句是这样的: //申明 int (^yxpBlock)(int, int)  =^(int a ) {return a*a ;}; 说明:返回值(^语句块名称)(传人参数类型)=^(传人参数){主体}: //调用 int result = square(5); 我建了一个测试项目包含了(yxpAppDe

一梦浮生2012 IOS基础恶补

一梦浮生2012 精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义UI控件,使用类别扩展系统控件功能; 擅长通讯技术,熟悉各种通信协议,精通xml, json, 二进制或其他形式的自定义解析,能架设服务器实现客户端与服务器的通讯以提交开发效率; 熟练掌握各种数据存储技术,如core data, sqlite,  对象序列化,文件读写操作,熟悉数据库的设计. 精通 object-c,java, c  等编程语言, 熟悉c++,对于 面向对象编程思想有深入理解,熟悉常

深入理解Objective C的ARC机制

前言 本文的ARC特指Objective C的ARC,并不会讲解其他语言.另外,本文涉及到的原理部分较多,适合有一定经验的开发者. 什么是ARC? ARC的全称Auto Reference Counting. 也就是自动引用计数.那么,为什么要有ARC呢? 我们从C语言开始.使用C语言编程的时候,如果要在堆上分配一块内存,代码如下 //分配内存(malloc/calloc均可) int * array = calloc(10, sizeof (int)); //释放内存 free(array);

iOS基础 02 StoryBoard 故事板文件

iOS基础 02 StoryBoard 故事板文件 目录: 1. 故事板的导航特点 2. 故事板中的Scene和Segue 3. 本文最后 在上篇HelloWorld工程中有一个Main.storyboard文件,它被称为“故事板”(storyboard)文件. 它可以描述应用中有哪些界面,界面有哪些控件以及它们的事件. 此外,故事板还能描述界面之间是如何导航的. 1. 故事板的导航特点 在包含多个视图控制器的情况下,采用故事板管理比较方便,而且故事板还可以描述界面之间的导航关系. 下面我们举例

iOS基础问答面试题连载(三)-附答案

「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 这次的问题是网络多线程相关的哟,面试的时候也是必问的,大家多看看 11月24日修正一处错误:18.19题目一样,答案不一样(其实是两种理解,修改为最优的一种放上来.多谢读者提醒) 以下是一些自己收集的网络多线程方面比较基础的问题(大神可以忽略),附上答案,方便大家阅读.俗话说得好,基