主页(http://www.kuwanit.com):iOS/OS X内存管理(一):基本概念与原理
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(请把#改成@)。
引用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)。
所以在管理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
发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。