YYModel 学习笔记

参考YYModel 学习笔记(一)

一.NSObject+YYModel.h

NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END

打开NSObject+YYModel.h,会看到NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END说明下: 如果需要每个属性或每个方法都去指定nonnull和nullable,是一件非常繁琐的事。苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。

1.nil Nil NULL NSNull kCFNull的区别

  • nil代表指向一个实例对象的空指针

NSString *msg = nil;

  • Nil表示指向一个类的空指针:

Class class = Nil;

  • NULL 定义其他类型(基本类型、c类型)的空指针

char *p = NULL;
NSNull 表示数组中的占位符,数组中的元素不能为nil, nil代表数组结束的标志, 所以为空的话可以用NSNull来占位
kCFNull : NSNull的单例
CF_EXPORT 就是 extern


kCFNull.png

(2)force_inline

define force_inline inline attribute((always_inline))

这行代码用到了C语言的内联函数
*内联函数: 是用inline修饰的函数,内联函数在代码层次看和普通的函数结构一样,却不具备函数的性质,内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入到调用处,和宏很类似,但是有一下不同点. 他们之间的区别在于: 宏是由预处理器进行替代的,而内联函数则是通过编译器控制实现的,内联函数是真正的函数,只有在需要用到的时候才会像宏那样的展开,所以取消了函数的参数压栈,减少了调用的开销,我们可以像调用函数一样调用内联函数,而不必担心产生于处理宏一样的问题.
*__inlineinline等同。inline__inline通知编译器将该函数的内容拷贝一份放在调用函数的地方,这称之为内联。内联减少了函数调用的开销,但却增加了代码量. __attribute__((always_inline))的意思是强制内联,所有加了__attribute__((always_inline))的函数再被调用时不会被编译成函数调用而是直接扩展到调用函数体内.

(3)block有三种形式的: NSStackBlock, NSGlobalBlock, NSMallocBlock.

*NSStackBlock表示在block内部引用外部变量的, NSGlobalBlock表示在block内部没有引用外部变量的, NSMallocBlock表示堆block,MRC下引用外部变量的需要手动copy到堆上,ARC下系统自动copy.
*block在ARC下也是有NSStackBlock的block的,只是当赋值给strong对象时,系统会主动对其进行copy.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • YYModel.h文件 注意点: 用#if __has_include( )判断是否包含某个类. FOUNDATI...
    GiantAxe77阅读 1,099评论 1 14
  • iOS宏的经典用法Apple的习惯attribute iOS宏的经典用法1.常量宏、表达式宏 define kTa...
    reallychao阅读 3,903评论 0 0
  • 前言 趁着公司最近没什么任务的时候,尽量多学习些新东西哈😆, 咱们接着上篇文章说,下面就从NSObject+YYM...
    GiantAxe77阅读 552评论 3 6
  • 前言 前段时间在研究YYModel框架时学到不少东西,尤其是下面要讲述的查看屏幕帧数的小工具.个人感觉在项目里比较...
    GiantAxe77阅读 645评论 2 2
  • 前言 通过阅读别人的优秀源码,你会发现别人的开源API设计中,有一些宏你是经常忽略的,或者你不知道的。通过这些宏,...
    gitKong阅读 5,193评论 5 41