@class和#import,define和static const,extern

@class和#import

什么时候用@class这种方式声明比#import好呢?
Randy Marsh:
When I develop, I have only three things in mind that never cause me any problems.
    1. Import super classes   引入子类
    2. Import parent classes (when you have children and parents)  引入父类
    3. Import classes outside your project (like in frameworks and libraries)  引入第三方框架的类
For all other classes (subclasses and child classes in my project self), I declare them via forward-class.
 
Justin:
Simple answer: You #import or #include when there is a physical dependency. Otherwise, you use forward declarations (@class MONClass ,struct MONStruct , @protocol MONProtocol ).
Here are some common examples of physical dependence:
    • Any C or C++ value (a pointer or reference is not a physical dependency). If you have aCGPoint as an ivar or property, the compiler will need to see the declaration ofCGPoint .
    • Your superclass.
    • A method you use.

什么时候用#import

1.有继承关系
2.使用第三方框架的时候

什么时候用@class

简单来说就是除了以上的情况之外都可以.

PS : 这个只是在.h文件中考虑是用@class还是#import,考虑点是编译的效率,如果使用了@class,在.m文件中还是需要#import相应的头文件

要点 :
• 除非确有必要,否则不要引入头文件.一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件.这样做可以尽量降低类之间的耦合
• 有时无法使用向前声明,比如要声明某个类遵循一项协议.在这种情况下.尽量把"该类遵循某协议"的这条声明移至"class-continuation分类"中.如果不行的话,就把协议单独放在一个头文件中,然后将其引入.


define和static const

一般定义一个固定的常量,会使用

#decine ANIMATION_DURATION 0.3

这种的方式存在一种隐式的危险,如果当前类被其他类引用,而其他类也正好有ANIMATION_DURATION,那么所有ANIMATION_DURATION都会被替换.(其实出现这种情况的概率很低)

static const NSTimeInterval kAnimationDuration = 0.3;

static : 表示kAnimationDuration在内存的常量区,只要值不变,内存空间不会发生变化.
const : 表示kAnimationDuration是只读状态

实际上,如果一个变量既声明static,又声明const没那么编译器根本不会创建符号,而是会像#define预处理指令一样,把所有遇到的变量都替换为常量值.不过还是要记住:用这种方式定义的常量带有类型信息.

什么时候用#define
什么时候用static const

这两个什么时候,或者什么情况下用都是一样的.一个是引入的一些小的风险细节,一个是带有类型信息.


extern

extern在C语言中,用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用"

如何理解:
iOS extern使用教程

简单粗暴的理解 :
在一个类中使用extern声明某个变量,就是告诉编译器,在内存中去找这个变量的值.至于这个变量声明在哪个类中并不重要.

你也可以随便extern一个变量名,比如:
extern NSString *asda
只要不调用.编译器都不会报错.因为只是告诉编译器,将会有一个这样的变量在内存中.你记得去找就可以了,当你调用之后,编译器会报错,告诉你,抱歉,我在内存中没找到这个变量.

什么时候使用extern合理.
这个在自己的项目中慢慢揣摩...方式有很多,也可以不用.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容

  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 4,966评论 0 13
  • static 修饰局部变量 让局部变量只初始化一次 局部变量在程序中只有一份内存 并不会改变局部变量的作用域,仅仅...
    大冲哥阅读 1,340评论 0 1
  • 时间过得很快,快得有时候会让人偶尔感到发蒙。流逝的岁月里,有着我们无悔的青春年华。我们忘不了,它深深的刻印在我们的...
    阿俊xi阅读 384评论 0 0
  • 一直很羡慕小Y和她媳妇的爱情。 大二一次社团活动上认识,那时的小Y还是专科院校里一个不起眼的小伙子,来...
    林承若阅读 897评论 0 0
  • 概念 约束优先级 所有约束都有1-1000的优先级。优先级为1000的约束是必须的。其它约束都是可选的。 注意:不...
    0o冻僵的企鹅o0阅读 505评论 1 2