Objective - C 内存管理(一)


小弟新手,对Objective-C中的内存管理机制和方法不是很精通,写个随笔和大家一起分享下,如有问题欢迎各位大大纠正。

闲言少叙,我们马上进入正题(本随笔内容参考<<好学的Objective-C>> 特此感谢原作者)

使用引用计数

每个从NSObject继承的对象都继承了一定的内存管理行为。在这些对象的内部存在一个称为保留计数的计数器。在进行某些调用时,计数器的值可以增加或者减少。

Objective-C语言运行时知道当保留计数为0时,目标对象就可以被释放。在对象释放时,其所有的内存资源都会归还给系统以供重复使用。

保留技术可以通过几种标准的方式增加。最常见的方式是使用名字中包含 alloc 或者 create 的方法创建一个新对象,返回对象的保留计数是1

此外,使用名字中包含 copy 一词的方法获取对象时,返回对象的保留计数也是1。还可以通过调用 retain 方法手动增加保留计数。

最后,可以通过调用 release 方法减少保留计数。再次强调,在保留计数变成0时,对象及其相应的内存都会被释放

---对象分配的标准方式---

Bar *foo = [[Bar alloc] init];

在本例中,执行完该方法后,foo对象的保留计数是1。

---保留对象---

Bar *foo = [[Bar alloc] init];
[foo retain];

在本例中,除了通过调用 alloc 分配一个对象外,还通过 retain 方法增加了保留计数。

执行完该方法后,对象的保留计数是2。

---分配和释放对象---

Bar *foo = [[Bar alloc] init];
[foo release];
[foo dosomething];

在本例中,调用 release 方法后,对象的保留计数变成了0,从而会被释放。其后的代码由于试图访问被释放的对象而导致程序崩溃

---内存泄露---

Bar *foo = [[Bar alloc] init];
[foo retain];
[foo release];

在本段代码中,首先分配了一个对象,然后保留了该对象,之后释放它,但只释放了一次。如果这是一个成员变量,我会再次向它发送 release 消息,从而再次释放对象,这样就没有问题了。

但在本例中,我们只在这个特定的栈中使用该代码,就会导致内存泄露。

---没有保留对象---

@interface Foo : NSObject
{
      memberVariable
}
@end

@implementation Foo

-(void)someMethod;
{
      memberVariable = [someOtherObject getFoo];
}

在本例中,所讨论的代码应该保留通过方法名中不带 alloc copy 或者 create 的调用获得的对象。在程序退出了该方法后,目标对象就会被程序运行时释放掉。

下次访问该对象时就会导致崩溃。由于此处的变量是作为成员变量使用的,所以应该保留。

说明

从技术上说,对象如果之前没有被保留,那么在下一个运行循环后会被释放。不过从循环内存管理规则的角度考虑,你可以假定对象出了作用域后,只要没有被保留,就会被释放。

PS:这就是Objective-C中引用计数的概念,下节内容我会分章节介绍具体内容(内存管理规则,使用自动释放,对象内部内存等)。

优质内容筛选与推荐>>
1、文件和目录操作命令(19 个)--14.dirname
2、快速操作Linux终端命令行的快捷键…
3、[Codeforces Round #301 (Div. 2) D]Bad Luck Island(概率Dp)
4、小程序 components 下的组件引入字体图标时样式不生效
5、最小生成树


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn