@class #import辨析 #include

 解析:

       很多刚开始学习iOS开发的同学可能在看别人的代码的时候会发现有部分#import操作写在 .m 文件中,而 .h 文件仅仅使用@class进行声明,不禁纳闷起来,为什么不直接把#import放到h文件中呢?

      这是因为 .h 文件在修改后,所有 #import 该 .h 文件的所有文件必须重 新Build,因此,如果把 #import 写在 .h 文件中,#impor t该 .h 文件的文件也就会产生不必要的编译,增加编译时间,特别是在项目文件多的情况 下。想象一下,如果只是修改一个 .h 文件而导致上百个文件不必要的编译,那是一件多么让人纠结的事情。。。对于@class只是告诉编译器有这个class,请不要报错或警告,因此不会给编译造成影响。

 

 

 

 下面来说一下#import同class之间的区别

 

     在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明,你们可能也见到在.h文件进用@class来声明的,那么#import和@class进行声明 到底有什么的区别呢?

 

           1. import会包含这个类的所有信息,包括实体变量和方法,而@class只告诉编译器,声明的类的名称,至于这些类是如何定义的,暂时不用考虑,所以在头文件中如果用@class声明某个类后,在.m的实现中如果用到声明类的具体方法或变量时还得再#import类  。

 

           2.在.h头文件中进行声明时用#import的话,如果100个头文件都#import同一个头件,或者这些文件是依次引用的,如A->B,B->C,C->D,当最开始的那个头文件有变化后进行编译时,后面所有引用它的类都需要重新编译,如果引用最开始的头文件的类很多的话,那么这将耗费大量的时间,而用@class则不会,可能有人会想即然.h只是用@class只是简单的一个声明告编译器有这个类不让其报错,那么.m中要用到引入的类的方法和属性时,不还是要#import头文件一次,是的这个是对的,但编译器编译的时候只编译头文件的,所以你的.m中用#import与编译时间没太大关系

 

  接下来说说什么时候该用@class,什么时候该用#import进行声明

 

           1.一般如果有继承关系的用#import,如B是A的子类那么在B中声明A时用#import

 

           2. 另外就是如果有循环依赖关系,如:A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错

 

          3.还有就是自定义代理的时候,如果在头文件中想声明代理的话如@interface SecondViewController:UIViewController时应用#import不然的话会出错误,注意XXXXDelegate是自定义的

 

在分析 #Imclude 和 #include的用法

 

 

#include
        区分 #include <x.h>与#include "x.h"的作用
        #include <x.h>:它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.
         #include "x.h":用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。
         在使用#include的时候要注意处理重复引用(这也是objc中#include与#import的区别)
        例如:ClassA 与 ClassB同时引用了ClassC,不做重复引用处理的时候在ClassD中同时引用ClassA,ClassB编译会提示对ClassC重复引用的错误.
         我们可以:#ifndef _CLASSC_H
                       #define _CLASSC_H
                       #include "ClassC"
                       #endif
         这样处理在编译时就不会有重复引用的错误出现(在objc中#import解决了这个问题,这是它们的区别)

#import
         #import 大部分功能和#include是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用再去自己进行重复引用处理.

@class
        主要是用于声明一个类,告诉编译器它后面的名字是一个类的名字,而这个类的定义实现是暂时不用知道的,后面会告诉你.也是因为在@class仅仅只是声明一个类,所以在后面的实现文件里面是需要去#import这个类,这时候才包含了这个被引用的类的所有信息。

综上所述#include,#import与@class的区别可以做一下理解:
         #include与#import在引用一个类的时候会包含这个类的所有信息包括变量方法等,但是这样做会对编译效率造成影响.比如有99个类都#import了ClassA,那么在编译的时候这99个类都会去对ClassA处理.又比如A被B引用,B被C引用,C被D引用.....此时如果A被修改,那么后面的B,C,D.....都需要重新进行编译.还有一个用法会引起编译错误的就是在ClassA中#import ClassB 在ClassB中#import ClassA那么在编译的时候也会出现未知错误。
        所以一般来说,在interface中引用一个类,就用@class,它会把这个类作为一个类型来使用,而在实现这个interface的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要import这个在@class中声明的类。

转载于:https://www.cnblogs.com/Sucri/p/5262215.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改数据包欺骗服务器,Fiddler协议捕获编辑工具与Session欺骗原理详解

今天Kitty主要与大家分享Fiddler抓包工具与协议捕获编辑工具来与大家讲解Session欺骗原理过程&#xff0c;咱们主要通过Fiddller协议捕获工具来对比HTTPWatch两款工具之间的差别&#xff0c;最主要的是我们可以通过捕获到的请求进行二次编辑重新发送给服务器&#xff0c;这中间…

统计源期刊目录_统计源期刊是什么意思

统计源期刊是什么意思&#xff1f;统计源期刊全称中国科技论文统计源期刊&#xff0c;也就是我们常说的科技核心期刊&#xff0c;科技核心期刊是我国核心期刊体系中的一类&#xff0c;在国内个人评职晋升、学术评估中占据着重要地位&#xff0c;统计源期刊也是根据期刊多方面指…

ajax 请求post和get,ajax请求get和post

ajax请求get和post 内容精选换一换正常返回值类型说明200OKGET、PUT、POST操作正常返回204No ContentDELETE操作正常返回异常返回值说明400 Bad Request服务器未能处理请求。401 Unauthorized被请求的页面需要用户名和密码。403 Forbidden对被请求页面的访问被禁止。404 Not Fo…

python requests 重试_我可以为requests.request设置最大重试次数吗?

这不仅会改变最大重试次数&#xff0c;而且还会启用回退策略&#xff0c;使所有http://地址在重试前睡眠一段时间(总共5次)&#xff1a;import requestsfrom urllib3.util.retry import Retryfrom requests.adapters import HTTPAdapters requests.Session()retries Retry(to…

产品专家Marty Cagan:不做仅仅会编码的人

Marty Cagan是享有世界声誉的产品管理专家&#xff0c;曾担任Netscape副总裁、eBay产品管理及设计高级副总裁。近日&#xff0c;记者在“PM-China首届产品经理高峰论坛”上对他做了专訪&#xff0c;请他分享自己的产品管理历程。 程序猿的工作 《程序猿》&#xff1a;据我所知。…

网页底部的版权信息_Shopify底部的版权信息(Powered by Shopify )如何删除

大多数新的Shopify商店所有者通常在一开始就遇到一个小问题。他们通常想摆脱商店页脚中的“Powered by Shopify”文本/链接。Shopify提供支持的含义是什么&#xff1f;Shopify是一个电子商务平台&#xff0c;可帮助创建和自定义电子商务商店。当您在此平台上创建商店时&#xf…

ftp 服务器 文件 连接 导出,ftp 服务器 文件 连接 导出

ftp 服务器 文件 连接 导出 内容精选换一换“数据导入”章节适用于MRS 3.x及后续版本。Loader是实现MRS与外部数据源如关系型数据库、SFTP服务器、FTP服务器之间交换数据和文件的ETL工具&#xff0c;支持将数据或文件从关系型数据库或文件系统导入到MRS系统中。Loader支持如下数…

自己的碎碎念

各位mmgg们&#xff0c;我是一个人见人爱&#xff0c;车载车爆胎的mm。 想知道我的年龄吗&#xff1f;我偷偷告诉你我正在学校和社会间徘徊&#xff08;年龄大了都不好意思明说了&#xff0c;没错&#xff0c;我就是娇羞&#xff09; 想知道我的职业吗&#xff1f;我想聪明的人…

python取绝对值数组_Python通用函数实现数组计算的方法

一.数组的运算数组的运算可以进行加减乘除&#xff0c;同时也可以将这些算数运算符进行任意的组合已达到效果。>>> xnp.arange(5)>>> xarray([0, 1, 2, 3, 4])>>> x5>>> xnp.arange(5)>>> x5array([5, 6, 7, 8, 9])>>> …

多个虚拟主机服务器,Windows多个虚拟主机服务器

Windows多个虚拟主机服务器 内容精选换一换迁移前&#xff0c;您需要设置目的端服务器。该目的端用来接收源端的数据&#xff0c;同时您也可以使用该目的端进行迁移测试和启动目的端。只有“迁移阶段”为“已就绪”时才可设置目的端。或单击“操作”列的“更多 > 设置目的端…

九度OJ #1437 To Fill or Not to Fil

题目描写叙述&#xff1a;With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different pri…

armv8 汇编 绝对地址赋值_详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系...

[TOC]为什么要有相对跳转和绝对跳转&#xff1f;顺序执行&#xff1a;指令一条一条按照顺序往下执行&#xff0c;比如变量的定义和赋值都是按照顺序执行的。跳转执行&#xff1a;当指令执行到当前位置后跳转到其他位置执行。比如&#xff0c;在主函数中调用其他函数就是典型的跳…

BZOJ 4034: [HAOI2015]T2 树链剖分

4034: [HAOI2015]T2 Description 有一棵点数为 N 的树&#xff0c;以点 1 为根&#xff0c;且树点有边权。然后有 M 个 操作&#xff0c;分为三种&#xff1a;操作 1 &#xff1a;把某个节点 x 的点权增加 a 。操作 2 &#xff1a;把某个节点 x 为根的子树中所有点的点权都增加…

mysql把游标数据存入表中_mysql数据库怎么使用游标

存储过程完整代码.CREATE DEFINERrootlocalhost PROCEDURE cj_zongfen()BEGINDECLARE yw INT;#语文成绩DECLARE sx INT;#数学成绩DECLARE yy INT;#英语成绩DECLARE d INT;DECLARE nf BOOLEAN DEFAULT TRUE;DECLARE zongfen_cursor CURSOR FOR SELECT yuwen,shuxue,yingyu,cid …

yum安装ruby_centos 6.5 ruby环境安装

redis3.0以上支持集群&#xff0c;自带集群管理工具redis-trib.rb&#xff1b;在搭建集群前&#xff0c;安装ruby环境安装开发工具1、命令&#xff1a;yum groupinstall "Development tools"清理已安装过的2、命令&#xff1a;yum erase ruby ruby-libs ruby-mode ru…

mongodb3.0 性能測试报告 一

mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三測试环境&#xff1a; 服务器&#xff1a;X86 pcserver 共6台 cpu&#xff1a; 单颗8核 内存&#xff1a;64G 磁盘&#xff1a; raid 10 操作系统 &#xff1a;centos 6.5 mongo…

db2 某个字段排序_MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序...

MySQL常规排序、自定义排序和按中文拼音字母排序&#xff0c;在实际的SQL编写时&#xff0c;我们有时候需要对条件集合进行排序。下面给出3中比较常用的排序方式&#xff0c;mark一下1.常规排序ASC DESCASC 正序DESC倒叙-- 此处不用多讲2.自定义排序自定义排序是根据自己想要的…

QML官方系列教程——QML Applications

附网址&#xff1a;http://qt-project.org/doc/qt-5/qmlapplications.html假设你对Qt的官方demo感兴趣&#xff0c;能够參考本博客的另一个系列Qt5官方demo解析集每一个绿色字体均是一篇博文连接。请收藏本文&#xff0c;本文会持续更新 。QML Applications —— QML应用程序QM…

51单片机基本刷屏测试实验_基于单片机的发动机振动速度、位移和加速度测量方法...

Single-chip microcomputer-based measuring of engine vibration  speed、displacement and accelerationAbstract: This paper presents a measuring method of engine vibration speed、displacement and acceleration。At first the signal from vibration senor of engin…

python正则表达式group用法_【Python】正则表达式用法

导读&#xff1a;正则在各语言中的使用是有差异的&#xff0c;本文以 Python 3 为基础。本文主要讲述的是正则的语法&#xff0c;对于 re 模块不做过多描述&#xff0c;只会对一些特殊地方做提示。很多人觉得正则很难&#xff0c;在我看来&#xff0c;这些人一定是没有用心。其…