文档章节

IOS OC 向前声明 forward declaring

卧龙小
 卧龙小
发布于 2015/06/24 20:50
字数 595
阅读 149
收藏 1
OC

一 向前引用 forward declaring

Objective-c 编写类 分别创建两个文件,头文件用.h,实现文件后缀用.m,代码示例如下:

== .h 文件
#import <Foundation/Foundation.h>
@interface Dog : NSObject
    @property (nonatomic, strong) NSString *name;
@end


== .m 实现文件
@implementation Dog
@end

查看Dog.h 文件,用Objective-C语言编写任何类几乎都需要引入Foundation.h,如果不引入这个文件的话,则需要引入预期超类所属框架相对应的"基本头文件"(base header file)。


现在创建个Person类,并引入Dog类

== .h 文件
#import <Foundation/Foundation.h>
#import “Dog.h" //引入Dog.h
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) Dog *dog;
@end

== .m文件
@implementation Person
@end


当系统编译Person.h 文件的时候,Dog 并不可见,必须引入Dog.h,常见方法为

#import "Dog.h"

由于在编译 Person 类的文件时,不需要知道Dog类的全部细节(Dog 类中的方法),若使用 #import "Dog.h"  则必须知道Dog.h的全部细节,而Person类中只需要知道类名Dog就可以了,可用通过以下方式告诉编译器@class Dog;这种方式娇 向前声明 (forward declaring)


修改后的Person.h 文件如下

== .h 文件
#import <Foundation/Foundation.h>
#class Dog; //引入Dog.h
@interface Person : NSObject
    @property (nonatomic, strong) NSString *name;
    @property (nonatomic, strong) Dog *dog;
@end


== .m 文件
#import "Dog.h"  //Person 的实现文件则需要引入Dog.h文件,需要知道Dog所有接口细节。
@implementation Person
@end


向前引用,就是将引入头文件的时间尽量延后,只在确有需要时才引入,这样就可用减少类的使用者所需要引入的头文件数量。



二 向前声明解决的问题

向前声明解决了两个类互相引用的问题。

假如Dog 类中,需要添加Persion 属性,如果使用使用#import "Person.h"则会导致循环引用,当解析到Dog.h文件时,编译器会发现它引入Person.h头文件,编译器在引入Person.h头文件时,Person.h头文件反过头来引用Dog.h头文件,造成循环引用。


三 总结

向前声明可用降低编译时间,除非必要,则可以使用向前申明,并在实现文件中映入头文件,这样做可用尽量降低类之间的耦合


© 著作权归作者所有

共有 人打赏支持
卧龙小
粉丝 42
博文 146
码字总数 70107
作品 0
西城
程序员
私信 提问
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
08/31
0
0
Unity与IOS交互,调用IOS系统相机和相册

前面两篇总结了一下unity与android的简单交互和调用安卓系统相机和相册,比较蛋疼的是,后来发现不同的测试机上会有不同的bug。。。下阶段要一个一个的解决一下 今天总结一下与IOS的交互。这...

qq_32587659
05/16
0
0
iOS使用Objective-c自定义cordova插件(-)

本系列教程为博主初次使用开发,内容如有差错,欢迎指正,敬请谅解。 博客地址:http://blog.img421.com/iosshi-yong-object-czi-ding-yi-cordovacha-jian/ Mac安装ionic和cordova我们已经熟悉,...

Michaelyn
2017/10/23
0
0
NS_ASSUME_NONNULL_BEGIN & NS_ASSUME_NONNULL_END

写在前面的话,很久没写技术文章了。自己一直对于系统的很多语法很好奇,就是系统的宏定义语法,不知道干什么的,今天研究一下,以后可以能继续的追加。错误的地方请大神指正留言,我会尽快的...

贝勒老爷
11/16
0
0
iOS使用Objective-c自定义cordova插件(二)

接上一章. 中还有其它的配置、、、以及配置文件. eg: 框架: <framework src="CFNetwork.frame" weak="true"/> plist文件: <resource-file src="src/ios/PushConfig.plist"/> 默认的info.plis......

Michaelyn
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MariaDB 服务器在 MySQL Workbench 备份数据的时候出错如何解决

服务器是运行在 MariaDB 10.2 上面的,在使用 MySQL Workbench 出现错误: mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"'......

honeymose
今天
3
0
apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
6
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
14
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
4
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部