autorelease会不会使ios 打印引用计数数减1

用户名:Im刘亚芳
文章数:175
访问量:54864
注册日期:
阅读量:1297
阅读量:3317
阅读量:455649
阅读量:1140265
51CTO推荐博文
person类 & -----》.h文件#import&&Foundation/Foundation.h&
@interface&Person&:&NSObject&NSCopying&&&//使用copy必须引入NSCopying协议。。。
//&&&&&&&&&&&&&&&&&&&&&语义设置
//1.NSString接收了copy协议,
//2.大多数规范化
@property&(nonatomic&,&copy)NSString&*
@property&(nonatomic&,&assign)NSInteger&
@property&(nonatomic&,&retain)NSString&*
@property&(nonatomic&,&copy)NSString&*
@property&(nonatomic&,&assign)NSInteger&
#pragma&mark&---自定义初始化方法
-&(instancetype)initWithName:(NSString&*)name&age:(NSInteger)age&hobby:(NSString&*)hobby&sex:(NSString&*)sex&num:(NSInteger)
@endperson类 & -----》.m文件#import&"Person.h"
@implementation&Person
@synthesize&name&=&_
@synthesize&age&=&_
@synthesize&hobby&=&_
@synthesize&sex&=&_
@synthesize&num&=&_
-&(void)setName:(NSString&*)name
&&&&if&(_name&!=&name)&{
&&&&&&&&[_name&release];
&&&&&&&&_name&=&[name&copy];
-&(NSString&*)name
&&&&return&[[_name&retain]&autorelease];
-&(void)setAge:(NSInteger)age
&&&&_age&=&
-&(NSInteger)age
&&&&return&_
-&(void)setSex:(NSString&*)sex
&&&&if&(_sex&!=&sex)&{
&&&&&&&&[_sex&release];
&&&&&&&&_sex&=&[sex&retain];
-&(NSString&*)sex
&&&&return&&[[_sex&retain]&autorelease];
-&(void)setHobby:(NSString&*)hobby
&&&&if&(_hobby&!=&hobby)&{
&&&&&&&&[_hobby&release];
&&&&&&&&_hobby&=&[hobby&copy];
-&(NSString&*)hobby
&&&&return&&[[_hobby&retain]&autorelease];
-&(void)setNum:(NSInteger)num
&&&&_num&=&
-&(NSInteger)num
&&&&return&&_
-&(instancetype)initWithName:(NSString&*)name&age:(NSInteger)age&hobby:(NSString&*)hobby&sex:(NSString&*)sex&num:(NSInteger)num
&&&&self&=&[super&init];
&&&&if&(self)&{
&&&&&&&&[self&setName:name];//1.0过度版
&&&&&&&&self.name&=&&&&//2.0终极版
//&&&&&&&&_age&=&
&&&&&&&&[self&setAge:age];//1.0
&&&&&&&&self.age&=&&&&//2.0
&&&&&&&&self.sex&=&
&&&&&&&&self.hobby&=&
&&&&&&&&self.num&=&
&&&&return&
-&(void)dealloc
&&&&NSLog(@"内存被回收了");
&&&&[super&dealloc];
-&(id)copyWithZone:(NSZone&*)zone&&//假拷贝
//&&&&return&
//&&&&return&[self&retain];
&&&&//浅拷贝
//&&&&Person&*p&=&[[Person&alloc]&initWithName:self.name&age:self.age&hobby:self.hobby&sex:self.sex&num:self.num];
//&&&&return&p;
&&&&//深拷贝
&&&&Person&*p&=&[[Person&alloc]&initWithName:self.name&age:self.age&hobby:self.hobby&sex:self.sex&num:self.num];
&&&&p.name&=&[self.name&copy];
//&&&&p.age&=&[self.age&copy];
&&&&p.hobby&=&[self.hobby&copy];
&&&&p.sex&=&[self.sex&copy];
//&&&&p.num&=&[self.num&copy];
&&&&return&p;
@endmain.m文件。。。。。。#import&&Foundation/Foundation.h&
#import&"Person.h"
int&main(int&argc,&const&char&*&argv[])
&&&&@autoreleasepool&{
&&&&&&&&//alloc&开辟内存空间,让被开辟的内存空间的引用计数变为1
&&&&&&&&Person&*p&=&[[Person&alloc]&init];
&&&&&&&&p.name&=&@"liuyafang";
&&&&&&&&p.age&=&25;
&&&&&&&&p.sex&=&@"男";
&&&&&&&&p.hobby&=&@"女";
&&&&&&&&p.num&=&201010;
&&&&&&&&//retain&引用计数加1,如果内存空间之前引用计数为1,retain之后变为2
&&&&&&&&[p&retain];
&&&&&&&&Person&*meiren&=&p;
&&&&&&&&//&release在1后,从1-&0的时候,自动调用dealloc方法,来回收内存。dealloc时继承自父类的方法,当对象引用计数为0的时候,由对象自动调用
&&&&&&&&[p&release];
&&&&&&&&NSLog(@"%@,%ld",&p.name&,&[p&retainCount]);//alloc开辟内存空间。0-&1
&&&&&&&&Person&*pp&=&[p&retain];&&//即指向,又拥有。
&&&&&&&&[p&release];
&&&&&&&&[pp&retain];
&&&&&&&&pp.name&=&@"pp";
&&&&&&&&NSLog(@"%ld,%@",&[pp&retainCount],pp.name);
&&&&&&&&[pp&release];
&&&&&&&&Person&*liu&=&pp&;
&&&&&&&&[liu&retain];
&&&&&&&&liu.name&=&@"刘亚方";
&&&&&&&&NSLog(@"%@,%ld",liu.name&,&[p&retainCount]);
&&&&&&&&[liu&release];
&&&&&&&&//autorelease,未来的某一时刻引用计数减1,这里的某一时刻指在出去autoreleasePool后。
&&&&&&&&//通过autoreleasepool控制autorelease对象的释放
&&&&&&&&//向一个对象发送autoresease消息,这个对象何时释放,取决于autoreleasepool
&&&&&&&&Person&*liuyafang&=&[[Person&alloc]&init];
&&&&&&&&[liuyafang&retain];
&&&&&&&&[liuyafang&retain];
&&&&&&&&[liuyafang&retain];
//&&&&&&&&[liuyafang&release];
&&&&&&&&NSLog(@"liuyafang:%ld",&[liuyafang&retainCount]);
&&&&&&&&[liuyafang&autorelease];
&&&&&&&&NSLog(@"liuyafang--&%ld",&[liuyafang&retainCount]);&&//autorelease只有出去autoreleasepool&之后才能-1才能使用
&&&&&&&&Person&*zhenzi&=&[[Person&alloc]&initWithName:@"疹子"&age:25&hobby:@"吃人"&sex:@"男"&num:36];
&&&&&&&&Person&*L&=&[zhenzi&copy];&
&&&&//这个是老方法NSAutoreleasePool
&&&&Person&*liuyafang&=&[[Person&alloc]&init];
&&&&[liuyafang&retain];
&&&&[liuyafang&retain];
&&&&NSAutoreleasePool&*pool&=&[[NSAutoreleasePool&alloc]&init];&&//autorelease老用法&。。。
&&&&[liuyafang&autorelease];
&&&&[pool&release];
&&&&NSLog(@"%ld",&[liuyafang&retainCount]);
&&&&return&0;
}一、基本原理(一)为什么要进行内存管理。由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。(二)对象的基本结构每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。(三)引用计数器的作用判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。(四)操作给对象发送消息,进行相应的计数器操作。Retain消息:使计数器+1,改方法返回对象本身Release消息:使计数器-1(并不代表释放对象)retainCount消息:获得对象当前的引用计数器值(五) 对象的销毁当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)&一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。二、相关概念和使用注意&野指针错误:访问了一块坏的内存(已经被回收的,不可用的内存)。僵尸对象:所占内存已经被回收的对象,僵尸对象不能再被使用。(打开僵尸对象检测)空指针:没有指向任何东西的指针(存储的东西是0,null,nil),给空指针发送消息不会报错注意:不能使用[p retaion]让僵尸对象起死复生。三、内存管理原则(一)原则&只要还有人在使用某个对象,那么这个对象就不会被回收;只要你想使用这个对象,那么就应该让这个对象的引用计数器+1;当你不想使用这个对象时,应该让对象的引用计数器-1;(二)谁创建,谁release(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法(2)不是你创建的就不用你去负责(三)谁retain,谁release只要你调用了retain,无论这个对象时如何生成的,你都要调用release(四)总结有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
各大公司的iphone面试题
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
各种iphone面试题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口下次自动登录
现在的位置:
& 综合 & 正文
对cocos2d 之autorelease\ratain\release的理解
看了上面博客中对autorelease的见解,对autorelease有了更深入的了解。但是还不是很理解,于是又看了代码。一开始对autorelease的“自动释放”的印象总是挥之不去。总是往java那样的完全自动释放那方面靠,于是第一感觉就错了。
以下仅针对 cocos2dx分析。
三种情况,引出问题
new出来的对象需要释放,而释放时,如果有其他人引用了这个对象,再次使用这个对象时,则会导致无效指针报错。
于是有了引用计数的施放管理机制。
对于一个返回对象指针的方法。你若不看文档不看内部代码,你无法知道返回的这个指针需不需要你来释放。同样的对于将一个指针作为参数给一个方法后,你为犹豫我能不能施放这个指针。因为你不知道这个方法内部会不会将你的指针施放。
于是有了谁拥有谁施放的施放管理思想。
使用了上述管理机制和思想后,有些特定情况。比如方法内新建一个对象,然后返回对象时,按照谁拥有谁施放。对象是在方法内部新建的,方法退出前不再拥有,所以要在方法退出前释放。但是又要在退出时返回该对象。先返回还是先释放都是不对的。。。
于是就有了autorelease。
1、release 和retain是配套的,释放管理是通过引用计数。
每一个CCObject对象都有一个引用计数。retain()时引用计数+1,release()则-1.在release之后,若引用计数为0,便会调用 真正的释放自己的内存。
CCObject新建的时候,引用计数默认为1.
2、release和retain的使用的指导思想是,谁拥有谁施放。
对于一个需要释放的变量。他的生命中通过新建、传递参数、方法返回值出现在各种地方,然而只有有人需要长期存储他的引用时,即想要拥有他,才应该调用retain()。释放时则秉着“谁retain谁施放”,retain和release的调用次数要配套。
------------------------------------------------------
void class IhaveObjHandler()
ObjX* objH
static void iWantObjX(objX* o){
objHandler =
objHandler-&retain();
IhaveObjHandler(){
objHandler =
~IhaveObjHandler(){
if(objHandler != NULL){ objHanlder-&release();}
void dispatchObjX(){
ObjX* obj = new ObjX(); // 位置1
IhaveObjHandler::iWantObjX( obj );
obj-&release();
------------------------------------------------------
示例中:需要释放管理的对象是 ObjX , 他在位置1新建,在位置2被传入到IhaveObjHandler。
位置1:因为obj新建时引用计数为1,而我(dispatchObjX方法)是不需要ObjX对象的,所以当我把他传给IhaveObjHandler 之后,我便释放他。
位置2:IhaveObjHandler里需要保存ObjX的引用,于是我(IhaveObjHandler类)调用retain()。当我不需要他,想要把他释放的时候调用release().
在释放的时候,注意自己retain几次,只能释放几次,不能过多释放。
3、autoreleas是一个特殊的release,即延后释放。
对比上面的dispatchObjX方法
------------------------------------------------------
ObjX* createObjX(){
ObjX* obj = new ObjX();
obj-&autorelease();
//位置3 如果改成 obj-&release();则obj的引用计数为0,会被释放。
return obj;
------------------------------------------------------
上面示例是一个产生新对象的方法。经常会用到,如果按照上述的释放管理思想,如位置3的注释写的那样。会在方法返回之前被释放。于是有了autorelease。
autorelease其实只是为obj设置一个标记,延后释放。在之后的某一时刻,对obj的autorelease标记做处理(即释放)。上面示例中autorelease不是立即减少obj引用计数,则方法可以安全。
4、autoRelease实现原理的小细节
关键字CCAutoreleasePool
autorelease的对象会加入到从池中,最迟会在每个主循环结束前释放。
池是用栈形式管理的。在适当情况下新建一个自动释放池,加入到栈中。所有要释放的对象都会加入到当前栈顶的这个池中,在特定情况(如每次主循环结束前),将池出栈。出栈时,做一些释放池中对象的处理。
当CCObject释放时,如果该对象仍在自动释放池中,则从池中删除自己。
同一个对象多次autorelease()的话,会被多次加入池中。池中对象存储结构是CCMutableArray,也就是vector.
5、 使用autorelease的好处
1、new出来的对象的释放问题解决了。符合谁拥有谁释放的原则。
2、可以避免频繁申请/释放内存 //ttun注:(没想出来,是什么意思)
6、其实autorelease并没有那么好用
综上,autorelease只不过解决了前言中及第三条说的引用计数的那个使用上的问题。对于引用计数本质没有太大改变。
我们依旧要很小心小心小心的注意释放对象的引用计数的变化。如果引用计数乱了一个的话,会导致报错。而且一旦因引用报错后,一般情况你是无法立即知道是哪里的引用除了问题。
另外,使用了引用计数的话,释放对象时别用delete, 而使用release()。
&&&&推荐文章:
【上篇】【下篇】手机门户>>
热门点击>>
手机腾讯>>
电脑上wap网:深入理解Objective C的ARC机制 - CocoaChina_让移动开发更简单
深入理解Objective C的ARC机制 - CocoaChina_让移动开发更简单
haodewap.net拍拖就应该经历一下异地恋。体会一下欣喜忧愁无从分享,欢笑落…【齐齐哈尔大学吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:129,908贴子:
拍拖就应该经历一下异地恋。体会一下欣喜忧愁无从分享,欢笑落…收藏
拍拖就应该经历一下异地恋。体会一下欣喜忧愁无从分享,欢笑落泪不能拥抱。隔着屏幕隔着电话隔着书信联系直到你几乎疯狂。学会拒绝诱惑,学会处理一个人的时间。也只有这样,在下一个拥抱,乃至白头偕老,你才会感恩,异地恋不仅是考验着对方的耐心,更是考验了自己的认真。‏
あいしてる
异地恋很累,要有很强的心理素质
五哥好有情趣啊
我们辛辛苦苦来到这个世界上,可不是为了每天看到的那些不美好而伤心的,我们生下来的时候就已经哭够了,而且我们谁也不能活着回去.所以,不要把时间都用来低落了,去相信,去爱去恨,去闯去梦.我们一定要相信,没有到不了的明天.
あいしてる
总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp.
18.目标-动作机制
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)
的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
19.cocoa touch框架
iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
20.objc的内存管理
如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥
有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也同样适用。
如果您拷贝一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放。
如果您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。
如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该释放它(这个规则有少数的例外,在参考文档中有显式的说明)。
21.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
22.类工厂方法是什么
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。
工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对象的分配信息。
类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽然init...方法可以确认一个类在每次程序运行过程只存在一个实例,但它需要首先分配一个“生的”实例,然后还必须释放该实例。 工厂方法则可以避免为可能没有用的对象盲目分配内存。
23.单件实例是什么
Foundation 和 Application Kit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如 NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。
24.动态绑定
—在运行时确定要调用的方法
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时, 特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。
求全文档....我闲出病了
- (NSArray *)bubble_sort:(NSArray *)array{
int count = [array count];
//申请临时数组,以存放本来在oc对象数组里的内容
int *tmpArray = (int *)malloc(sizeof(int)*count);
if (tmpArray == NULL) {
printf("malloc error");
//把oc对象数组里的内容暂时存放到临时数组里
for (int i = 0; i & i++) {
tmpArray[i] = [[array objectAtIndex:i] intValue];
//冒泡排序过程
for (int i = 0; i & count-1; i++) {
for (int j = 0; j & count-1-j; j++) {
if (tmpArray[j] & tmpArray[j+1]) {
tmp = tmpArray[j];
tmpArray[j] = tmpArray[j+1];
tmpArray[j+1] =
//最后把把排序后的结果回写到oc对象数组里。
NSMutableArray *results = [NSMutableArray array];
for (int i = 0; i & i++) {
[results addObject:[NSNumber numberWithInt:tmpArray[i]]];
//释放临时数组空间
free(tmpArray);
//返回结果
return [NSArray arrayWithArray:results];}
意思是由开发人员提供相应的代码:对于只读属性需要提供 setter,对于读写属性需要提供 setter 和 getter。 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。
我以为是文艺贴
结果变成了- -
1、写出一些常见的库,你用的操作系统,各个操作系统的区别
asi, json, gdata, sdwebimage
2、UITableView有时候不太流畅,有什么优化方案
使用多线程和异步加载数据
3、UIimageView怎么使其有单击,双击事件
userInteraction = yes
4、***和opengl
blocks语法
5、两个多线程怎么通讯,两个非UI线程怎么通讯
6、将一组数据永久保存到手机里,怎样做?
Nsuserdefaults,
7、实现一个横向划动的表格,有什么思路
继承uiscrollview
8、.m里面的私有方法其他的类能不能调用,若强行调用会由什么问题
没有什么问题,可以调用
那不是考研,是上辈子的罪孽
登录百度帐号推荐应用

我要回帖

更多关于 python 引用计数 的文章

 

随机推荐