联系
我们
投稿
反馈
评论 返回
顶部

内容字号: 默认 大号超大号

段落设置: 段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

iOS/OS X内存管理(一):基本概念与原理

2017-10-17 12:22 出处:互联网 人气: 评论(
觅食的意思 农村电影村官过大年 农家小子修真记 女人不坏首席请克制 女王的教室金道振 女巫店博客大巴 虐恋无忌 虐杀原形2莫瑟死后有什么任务

iOS 5/OS X Lion前的(等下会介绍引入ARC的写法)实例代码如下:

我们总结一下编译器是按以下方法来实现的:

@autoreleasepool { id __autoreleasing obj = [[NSObject alloc] init]; }

相比之前的创建、使用和释放NSAutoreleasePool对象,现在你只需要将代码放在@autoreleasepool块即可。你也不需要调用autorelease方法了,只需要用__autoreleasing修饰变量即可。


__strong ownership qualifier

如果我想创建一个字符串,使用完之后将它释放调用,使用MRC管理内存的写法应该是这样:

for (int i = 0; i < numberOfImages; i++) { /* 处理图片,例如加载 * 太多autoreleased objects存在 * 由于NSAutoreleasePool对象没有被释放 * 在某个时刻,会导致内存不足 */ }ARC管理方法

iOS/OS X内存管理方法有两种:手动引用计数(Manual Reference Counting)和自动引用计数(Automatic Reference Counting)。从OS X Lion和iOS 5开始,不再需要程序员手动调用retain和release方法来管理Objective-C对象的内存,而是引入一种新的内存管理机制Automatic Reference Counting(ARC),简单来说,它让编译器来代替程序员来自动加入retain和release方法来持有和放弃对象的所有权。

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿、寻求《近匠》报道,或给文章挑错,欢迎发送邮件至tangxy#csdn.net(请把#改成@)。 


  • 创建一个NSAutoreleasePool对象;
  • 在autorelease pool块的对象调用autorelease方法;
  • 释放NSAutoreleasePool对象。


  • 引用Pro Multithreading and Memory Management for iOS and OS X的图

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // put object into pool id obj = [[NSObject alloc] init]; [obj autorelease]; [pool drain]; /* 超过autorelease pool作用域范围时,obj会自动调用release方法 */

    引入ARC之后,写法比之前更加简洁:
    __weak id obj0 = nil; { id obj1 = [[NSObject alloc] init]; // 对象A /* 由于obj1是强引用,所以obj1持有对象A的所有权,对象A的RC=1 */ obj0 = obj1; /* 由于obj0是__unsafe_unretained,它不持有对象A的所有权,但能够引用它,对象A的RC=1 */ NSLog(@"A: %@", obj0); } /* 当obj1超过它的作用域时,它指向的对象A将会自动释放 */ NSLog(@"B: %@", obj0); /* 由于obj0是__weak, 当它指向的对象RC=0时,它会自动设置为nil,所以两个打印结果将不同*/

    而Objective-C对象的动作对应有哪些方法以及这些方法对引用计数有什么影响?


    第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。


  • __strong(默认,如果不指定其他,编译器就默认加入)
  • __weak
  • __unsafe_unretained
  • __autoreleasing
  • 所以在管理Objective-C对象内存的时候,你必须选择其中一个,下面会用一些列子来逐个解释它们的含义以及如何选择它们。

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // put object into pool id obj = [[NSObject alloc] init]; [obj autorelease]; [pool drain]; /* 超过autorelease pool作用域范围时,obj会自动调用release方法 */

    由于放在autorelease pool的对象并不会马上释放,如果有大量图片数据放在这里的话,将会导致内存不足。

    引用Pro Multithreading and Memory Management for iOS and OS X的图

    { NSString *text = @"Hello, world"; //@"Hello, world"对象的RC=1 NSLog(@"%@", text); [text release]; //@"Hello, world"对象的RC=0 }

    而如果是使用ARC方式的话,就text对象无需调用release方法,而是当text变量超过作用域时,编译器来自动加入[text release]方法来释放内存。

    引用Pro Multithreading and Memory Management for iOS and OS X的图

    引用Pro Multithreading and Memory Management for iOS and OS X的图

    __autoreleasing ownership qualifier
    分享给小伙伴们:
    本文标签:

    更多文章

    相关文章

    评论

    发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

  • 蛮便宜
  • 抠门网
  • Copyright © 2002-2014 版权所有