读第三方开源框架SDWebImage随笔
1,extern 作用:可以访问外部文件的变量。
定义一个GFA.h 和 GFA.m
在GFA.m的@implement 下面定义一个int a =20;
我们可以在viewcontroller中不用导入GFA的头文件下访问 a变量
eg:extern int a; 这个时候并不是定义变量a 而是拿到变量 a 也可以修改 a = 10;
2,const 修饰距离const右边最近的变量 英文单词翻译过来就是常量的意思 可以修饰右边的基本变量和指针变量
被const修饰过的变量只能读,不能修改
int const *p // *p只读 ;p变量
int * const p // *p变量 ; p只读
const int * const p //p和*p都只读
int const * const p //p和*p都只读
注: 判断p 和p是只读还是变量,关键是看const在谁前面。如果只在p前面,那么p只读,p还是变量;如果在p前面,那么p只读 ,p变量。
//定义一个全局只读变量
NSString * const kuserName = @"appkey";
//static修饰后此全局变量只能本文件访问
static NSString *const Key = @"hello”;
3,static a: 修饰局部变量 保证局部变量永远只初始化一次,在程序的运行过程中永远只有一份内存, 生命周期类似全局变量了 作用域还是在函数范围内
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ //声明一个局部变量x
int x = 0; //每次点击view来到这个方法时让i自增
x ++; //打印结果
NSLog(@"i=%d",x);
}
b:修饰全局变量
使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。
iOS中在一个文件声明的全局变量,工程的其他文件也是能访问的,但是我又不想让其他文件访问,这时就可以用static修饰它了,比较典型的是使用GCD一次性函数创建的单例,全局变量基本上都会用static修饰。
下面是一个GCD一次函数创建的单利
@implementation LoginTool
//static修饰全局变量,让外界文件无法访问
static LoginTool *_sharedManager = nil;
+ (LoginTool *)sharedManager {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedManager = [[self alloc] init];
});
return _sharedManager;
}
inline
在iOS中的一些框架中,static inline是经常出现的关键字组合.
static自不用多说,表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A.不会导致重名的错误.
inline. 内联函数.
作用:替代宏.
当然inline函数与宏有区别,inline可以:
解决函数调用效率的问题:
函数之间调用,是内存地址之间的调用,当函数调用完毕之后还会返回原来函数执行的地址。函数调用有时间开销,内联函数就是为了解决这一问题。
不用inline修饰的函数, 汇编时会出现 call 指令.调用call指令就是就需要:
(1)将下一条指令的所在地址入栈
(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序).
为什么inline能取代宏?
优点相比于函数:
inline函数避免了普通函数的,在汇编时必须调用call的缺点:取消了函数的参数压栈,减少了调用的开销,提高效率.所以执行速度确比一般函数的执行速度要快.
2)集成了宏的优点,使用时直接用代码替换(像宏一样);
优点相比于宏:
1)避免了宏的缺点:需要预编译.因为inline内联函数也是函数,不需要预编译.
2)编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
3)可以使用所在类的保护成员及私有成员。
inline内联函数的说明
1.内联函数只是我们向编译器提供的申请,编译器不一定采取inline形式调用函数.
2.内联函数不能承载大量的代码.如果内联函数的函数体过大,编译器会自动放弃内联.
3.内联函数内不允许使用循环语句或开关语句.
4.内联函数的定义须在调用之前.