iOS——引用计数(一)

自动引用计数

自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术。

满足以下要求后,我们的代码就无需再次键入retain或者是release代码了:

  1. 使用Xcode 4.2或以上版本
  2. 使用LLVM编译器3.0或以上版本
  3. 编译器选项中设置ARC为有效
    在以上条件下编译源代码时,编译器将自动进行内存管理。

手动内存管理/引用计数

对OC中对象所做的动作:1、生成对象;2、持有对象;3、释放对象;4、废弃对象

内存管理的思考方式

  • 自己生成的对象,自己所持有
  • 非自己生成的对象,自己也能持有
  • 不再需要自己持有的对象时释放
  • 非自己持有的对象无法释放
    除了上面提到的"生成"、"持有"、"释放",在OC的内存管理中还要加上"废弃"一词。
    以上的操作对应的OC方法:
    这些有关OC内存管理的方法,实际上不包含在OC该语言中,而是包含在Cocoa框架中用于OS X、iOS应用开发。Cocoa框架中Founfation框架类库的NSObject类负担内存管理的职责。OC内存管理中的alloc/retain/relesase/dealloc方法分别指代NSObject类的alloc类方法、retain实例方法、release实例方法和delloc实例方法。

自己生成的对象,自己所持有

使用以下名称开头的方法意味着自己生成的对象只有自己持有:

  • alloc
  • new
  • copy
  • mutableCopy

非自己生成的对象,自己也能持有

除了用上面名称开头的方法,用其他的方法创建的对象都是非自己生成的对象,但是自己也能持有。例如:

objectivec 复制代码
id obj = [NSMutableArray array];

在该代码中,NSMutableArray类对象被赋值给变量obj,但是变量obj并不自己持有该对象。使用retain方法可以使非自己生成的对象成为自己所持有的。

objectivec 复制代码
[obj retain];

不再需要自己持有的对象时释放

自己持有的对象不再需要时,持有者有义务释放该对象:释放使用release方法

objectivec 复制代码
[obj release];
//释放对象
objectivec 复制代码
- (id)allocObject {
  id obj = [[NSObject alloc] init];
  return obj;
}
objectivec 复制代码
//取得非自己生成但是自己持有的对象
id obj1 = [obj0 allocObject];
复制代码
对象一经释放绝对不可访问

非自己持有的的对象,若用retain方法变为自己持有,也同样可以使用release方法释放。被自己持有的对象一旦不再需要,务必要释放。

  • autorelease方法:该方法可以使取得的对象存在,但是自己不持有:
objectivec 复制代码
- (id) object {
  id obj = [[NSObject alloc] init];
  [obj autorelease];
  return obj;
}
  • autorelease方法提供这样的功能,使对象在超出指定的生存范围时能够自动并正确的释放
    当然,也可以通过retain方法将调用autorelease方法取得的对象变为自己持有

无法释放非自己持有的对象

访问已经被废弃的对象,或者释放"取得的对象存在,但是自己不持有对象"的时候,会发生崩溃

相关推荐
开心就好202514 小时前
uni-app 本地打包 iOS,在 Windows 上使用 KXBuild 产出 ipa 并上架的完整流程
后端·ios
调试人生的显微镜14 小时前
跨平台抓包工具怎么选?TraceEagle抓包鹰 的四种跨平台能力
后端·ios
2501_9159090616 小时前
Ipa Guard 防护上架,混淆、重签名和回归测试怎么做
android·ios·小程序·https·uni-app·iphone·webview
木头分享18 小时前
2026淘宝、京东双11活动全自动脚本丨IOS+安卓
ios
茶底世界之下18 小时前
红花太抢眼,蓝天又想留下:用 Awaking 比较两种减饱和
ios
2501_9160088921 小时前
Windows 上写第一个 SwiftUI App,KXBuild 空工程起步,跑到 iPhone 真机
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_9159184121 小时前
iOS 上架注意事项有哪些?Appuploader 的四个阶段自查清单
android·ios·小程序·https·uni-app·iphone·webview
黑化旺仔2 天前
【OC】Runtime:类元数据、加载初始化与消息派发
开发语言·macos·ios·objective-c
songgeb2 天前
iOS App支持设置RTL语言的实践
ios·swift·ui kit
软泡芙2 天前
【iOS】swift启动屏显示黑屏
ios