1.static全局变量与普通的全局变量有什么区别?:
static全局变量只初使化一次,防止在其他源文件中被引用;
2.static局部变量和普通局部变量有什么区别?
static局部变量只被初始化一次,下一次依据上一次结果值;
3.static函数与普通函数有什么区别?
static函数在内存中只有一份,普通函数在每个被调用中都维持一份拷贝
4.__bridge、__bridge_transfer、__bridge_retained三者之间的区别。
__bridge:,ARC下编译器不允许你隐式的将Object-C 指针转换成C指针,被代入对象的所有者需要明确对象生命周期的管理,不要出现异常访问的问题。
id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
__bridge_retained: 将Objective-C对象转换为Core Foundation对象,把对象所有权桥接给Core Foundation对象,同时剥夺ARC的管理权。告诉ARC 一旦__bridge_retained转换完成,ARC就不用在负责释放该对象了,使用者需要手动释放,即使用者拥有该对象的持有权。
d obj = [[NSObject alloc] init];
void *p = (__bridge_retained void *)obj;
非ARC下等价于
id obj = [[NSObject alloc] init];
void *p = obj;
[(id)p retain];
__bridge_transfer:非Objective-C对象转换为Objective-C对象,同时将对象的管理权交给ARC,开发者无需手动管理内存。在类型转换后,让其释放原先所有权的时候,需要使用 __bridge_transfer 关键字,告诉ARC 一旦__bridge_transfer转换完成,ARC要负责释放该对象!
NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
aNSString = (__bridge_transfer NSString *)aCFString;
可以看出来 __bridge_retained 是替我们做了 retain。剥夺ARC的管理权
可以看出来 __bridge_transfer 是替我们做了 release。ARC获得管理权
Toll-Free bridged
在iOS世界,主要有两种对象:Objective-C 对象和 Core Foundation 对象0。Core Foundation 对象主要是有C语言实现的 Core Foundation Framework 的对象,其中也有对象引用计数的概念,只是不是 Cocoa Framework::Foundation Framework 的 retain/release,而是自身的 CFRetain/CFRelease 接口。
这两种对象间可以互相转换和操作,不使用ARC的时候,单纯的用C原因的类型转换,不需要消耗CPU的资源,所以叫做 Toll-Free bridged。比如 NSArray和CFArrayRef, NSString和CFStringRef,他们虽然属于不同的 Framework,但是具有相同的对象结构,所以可以用标准C的类型转换。
http://blog.csdn.net/yiyaaixuexi/article/details/8553659
https://www.cnblogs.com/xinye/p/3168601.html
网友评论