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方法取得的对象变为自己持有

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

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

相关推荐
iFlyCai8 小时前
Xcode 16 pod init失败的解决方案
ios·xcode·swift
郝晨妤18 小时前
HarmonyOS和OpenHarmony区别是什么?鸿蒙和安卓IOS的区别是什么?
android·ios·harmonyos·鸿蒙
Hgc5588866618 小时前
iOS 18.1,未公开的新功能
ios
CocoaKier19 小时前
苹果商店下载链接如何获取
ios·apple
zhlx283521 小时前
【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
macos·ios·cocoa
XZHOUMIN1 天前
网易博客旧文----编译用于IOS的zlib版本
ios
爱吃香菇的小白菜1 天前
H5跳转App 判断App是否安装
前端·ios
二流小码农2 天前
鸿蒙开发:ForEach中为什么键值生成函数很重要
android·ios·harmonyos
hxx2212 天前
iOS swift开发--- 加载PDF文件并显示内容
ios·pdf·swift
B.-2 天前
在 Flutter 应用中调用后端接口的方法
android·flutter·http·ios·https