美文网首页
2019-03-21

2019-03-21

作者: winterJiao_d00b | 来源:发表于2019-03-21 14:19 被阅读0次

读第三方开源框架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.内联函数的定义须在调用之前.

相关文章

网友评论

      本文标题:2019-03-21

      本文链接:https://www.haomeiwen.com/subject/hqvqvqtx.html