Objective-C:ARC自动释放对象内存

ARC是cocoa系统帮你完成对象内存释放的引用计数机制

    .h文件

 1 //  Person.h
 2 //  01-ARC
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import <Foundation/Foundation.h>
 9
10 @interface Person : NSObject
11 @property(nonatomic,strong)NSString *name;
12 @property(nonatomic,assign)NSInteger age;
13 +(Person*)personWithName:(NSString*) name andAge:(NSInteger) age;
14 -(id)initWithName:(NSString*) name andAge:(NSInteger) age;
15 -(void)show;
16 @end

    .m文件

 1 //  Person.m
 2 //  01-ARC
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import "Person.h"
 9
10 @implementation Person
11 -(id)initWithName:(NSString*) name andAge:(NSInteger) age
12 {
13     self = [super init];
14     if(self)
15     {
16         _name = name;
17         _age = age;
18     }
19     return self;
20 }
21
22 /*
23  在类方法中,由于没有创建对象实例,所以:self指针不能用,实例变量不能用。
24  */
25 +(Person*)personWithName:(NSString*) name andAge:(NSInteger) age
26 {
27     return [[Person alloc]initWithName:name andAge:age];
28 }
29
30 -(void)show
31 {
32     NSLog(@"name:%@,age:%ld",_name,_age);
33 }
34
35 /*
36 创建对象时是先创建父类的部分,再创建子类的部分;
37  销毁对象时,顺序正好相反
38  ARC禁止显式的发送dealloc消息
39 */
40 -(void)dealloc
41 {
42     NSLog(@"person dealloc");
43     //[super dealloc]; //禁止显式的发送dealloc消息
44 }
45 @end

    主函数测试

 1 //  main.m
 2 //  01-ARC
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import <Foundation/Foundation.h>
 9 #import "Person.h"
10 int main(int argc, const char * argv[])
11 {
12     @autoreleasepool
13     {
14         Person *person = [[Person alloc]initWithName:@"Jim" andAge:22];
15
16         [person show];
17         //[person dealloc];//error,底层会自动调用该方法用来销毁对象
18     }
19     return 0;
20 }

    测试结果:

2015-08-13 17:48:54.904 01-ARC[1636:107161] name:Jim,age:22
2015-08-13 17:48:54.905 01-ARC[1636:107161] person dealloc
Program ended with exit code: 0
时间: 2024-11-09 00:07:15

Objective-C:ARC自动释放对象内存的相关文章

Objective-C:MRC手动释放对象内存举例(引用计数器)

手机内存下的类的设计练习: 设计Book类, 1.三个成员变量: title(书名)author(作者).price(价格) 2.不使用@property,自己完成存取方法(set方法,get方法) 3.加入必要其他的方法 4.并对Book类进行测试 .h声明文件 1 // Book.h 2 // 引用计数器 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 /

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

第34条:以“自动释放池块”降低内存峰值

本条要点:(作者总结) Objective-C 对象的生命期取决于其引用计数(参见第29条).在 Objective-C 的引用计数架构中,有一项特性叫做"自动释放池"(autorelease pool).释放对象有两种方式:一种是调用 release 方法,使其保留计数立即递减:另一种是调用 autorelease 方法,将其加入 "自动释放池"中.自动释放池用于存放那些需要稍后某个时刻释放的对象.清空(drain)自动释放池时,系统会向其中的对象发送 relea

刀哥多线程自动释放池autoreleasepool

自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息,释放池中对象 自动释放池,在 ARC & MRC 程序中,同样有效 高级面试题: 自动释放池是什么时候创建的?什么时候销毁的? 创建,运行循环检测到事件并启动后,就会创建自动释放池 销毁:一次完整的运行循环结束之前,会被销毁 常见面试题 for (long i = 0; i < largeNum

ios自动释放池

自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶.接收autorelease消息的对象将被放入到最顶端的自动释放池中.如 果将一个对象放入一个自动释放池中,然后创建一个新的自动释放池再销毁该新建的自动释放池,则这个自动释放对象仍将存在,因为容纳该对象的自动释放池仍然 存在. 什么是自动释放池 1.Autorelease pool 自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放.自动释放池本事销毁的

【cocos2d-x 3.x 学习笔记】对象内存管理

内存管理 内存管理一直是一个不易处理的问题,开发者必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完毕后有效地释放内存,即管理对象的生命周期.由于C++是一个较为底层的语言,其设计上不包含任何智能管理内存的机制.一个对象在使用完毕后必须被回收,然而在复杂的程序中,对象所有权在不同程序片段间传递或共享,使得确定回收的时机十分困难,因此内存管理成为了程序员十分头疼的问题. 另一方面,过于零散的对象分配回收可能导致堆中的内存碎片化,降低内存的

(20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)

引用计数 引用计数是c/c++项目中一种古老的内存管理方式.当我8年前在研究一款名叫TCPMP的开源项目的时候,引用计数就已经有了. iOS SDK把这项计数封装到了NSAutoreleasePool中.所以我们也在Cocos2d-x中克隆了一套CCAutoreleasePool.两者的用法基本上一样,所以假如你没有涉及过ios开发,你可以看看苹果官方文档NSAutoreleasePool Class Reference. CCAutoreleasePool Cocos2d-x的CCAutore

自动释放池的原理

自动释放池的原理: 每一次运行循环开启时,会创建自动释放池 程序执行过程中的自动释放对象,出了作用域之后,会被添加到最近的自动释放池 运行循环结束前,会释放自动释放池 以下是图解:

误释放对象

问题一: value = [array objectAtIndex:n]; //得到一个数组中的对象 [arry removeObjectAtIndex:n]; //卸载那个对象 因为value得到了那个对象,但是由于另外一个拥有者release了该对象,所以其实value现在成了摇摆指针(无效数据) 问题二: myArray = [NSArray array]; ... [myArray release]; NSArray返回的是一个自动释放对象,不仅myArray不应该在一段时间后relea