《Objective-C 高级编程》学习笔记2-Blocks
编程
GNUstep 是 Cocoa 框架的互换框架函数
2.2.一、GNUstep 中 alloc 类方法实现的简化版:post
struct obj_layout {
NSUInteger retained;
};
+ (id)alloc {
int size = sizeof(struct obj_layout) + 对象大小;
struct obj_layout *p = (struct obj_layout *)calloc(1, size);
return (id)(p + 1);
}复制代码
2.2.二、alloc 返回对象的内存图:学习
2.2.三、GNUstep 内存管理总结:ui
// __CFDoExternRefOperation 函数按 retainCount/retain/release 操做进行分发调用不一样函数
// NSObject 类的相关方法实现以下:
- (NSUInteger)retainCount {
return (NSUInteger)__CFDoExternRefOperation(OPERATION_retainCount, self);
}
- (id)retain {
return (id)__CFDoExternRefOperation(OPERATION_retain, self);
}
- (void)release {
__CFDoExternRefOperation(OPERATION_release, self);
}复制代码
GNUstep 将引用计数保存在对象占用内存块头部的变量中,spa
苹果则是保存在引用计数表的记录中:
3d
经过内存块头部管理引用计数的好处:指针
经过引用计数表管理引用计数的好处:code
OC 编程中为了处理对象,可将变量类型定义为 id 类型或各类对象类型:
ARC有效时,id类型和对象类型必须附加全部权修饰符:
3.1.一、__strong修饰符:默认的全部权修饰符
__strong修饰符表示对对象的“强引用”。持有强引用的变量在超出其做用域时被废弃,随着强引用的失效,引用的对象会随之释放。
3.1.二、__weak修饰符:避免引用循环,弱引用不能持有对象实例
循环引用容易形成内存泄漏,内存泄漏就是应当废弃的对象在超出其生存周期后继续存在。
__weak修饰符,在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效且处于nil被赋值的状态。
3.1.三、__unsafe_unretained修饰符:在iOS如下中用来代替__weak
附有__unsafe_unretained修饰符的变量不属于编译器的内存管理对象
赋值给附有__unsafe_unretained修饰符变量的对象在经过该变量使用时,若是没有确保其确实存在,则应用程序会崩溃。
3.1.四、__autoreleasing修饰符
ARC有效时,指定“@autoreleasepool块”替代“NSAutoreleasePool”类,用附有 __autoreleasing 修饰符的变量替代 autorelease 方法。
不使用 __autoreleasing 修饰符也能使对象注册到 autoreleasepool。因为return使强引用持有的对象超出做用域会被释放,但该对象做为函数的返回值,编译器会自动将其注册到 autoreleasepool。
在访问附有 __weak 修饰符的变量时,实际上一定要访问注册到 autoreleasepool 的对象。
在 ARC 有效的状况下编译源代码,必须遵照必定的规则:
3.2.三、ARC 有效时须遵照内存管理的方法命名规则
在 ARC 无效时,用于对象 生成/持有 的方法必须遵照命名规则:
在 ARC 有效时,以上规则没有改变。只是要追加一条命名规则:
当 ARC 有效时,Objective-C 类的属性也会发生变化: