好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

iOS objectiveC retainCount, OC计数器的思考

iOS objectiveC retainCount, OC计数器的思考

iOS objective-C retainCount, OC计数器的思考

学OC,肯定知道内存管理机制的原则。这里说说某些特殊的情况。

之前曾说,NSString的计数器比较特殊,大家注意下。

今天说另外一种,也是比较纠结的,以至于朋友都说这是OC BUG。。。

创建一个Class:

 //  H 
 #import  <Foundation/Foundation.h>

 @interface   Car : NSObject

 - ( void  )show;

  @end 

 //  M 
 #import   "  Car.h  " 

 @implementation   Car

 - ( void  )show;{
    NSLog(  @"  exec Finished!!!  "  );
}

  @end 

很简单的show方法,确认Car类是否被free;

运行方法:

Car *car =  [[Car alloc] init];
[car show];
[car release];
[car show];
NSLog(  @"car retainCount:  %d  " , [car retainCount]);

某些人可能一眼看出,执行未完成就会Crash;

但事实是,毫无Crash征兆,并且retainCount printf 1;

为什么会这样??经过与几个基友讨论,得出以下结论:

1.car堆被标记,即release执行完成,但因为不是立即释放,所以内存还存在;

2.存在栈中的car指针不由我们控制,同样未释放。

所以,给car指针指向的那块内存发送show消息时,又得到了结果。

既然不是OC的BUG,那如果避免?

在我们的项目中,肯定不会出现这样的问题,因为当堆被标记,有新创建的OBJ,会自动占用掉。

可以这样模拟:

Car *car =  [[Car alloc] init];
[car show];
[car release];
  for  ( int  i =  0 ; i <  1000 ; i++ ) {
    @autoreleasepool {
        NSString  *str = [NSString stringWithFormat: @"  X%d  "  , i];
        NSLog(  @"  %@  "  , str);
    }
}
[car show];
NSLog(  @"  %d  " , [car retainCount]);

此时,不等运行到显示car的retainCount,已经Crash;

符合我们的结论;

如何避免就是大家熟悉的,在release后再设置nil即可;

其他的内存方面就不说了,只说奇葩的部分!!不对的地方请指出,谢谢。

 

 

分类:  iphone

标签:  iOS objective-C retainCount ,  OC计数器

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

摘要: 阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教:copy与retain的区别:copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化.copy减少对象对上下文的依赖。retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝。当然在ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying 协议的类可以发送c 阅读全文

posted @  2012-05-14 17:10  Maxfong 阅读(76) |  评论 (0)    编辑

 

对数据对象进行归档和取消

摘要: 对数据对象进行归档 View Code NSMutableData*data=[[NSMutableDataalloc]init];NSKeyedArchiver*archiver=[[NSKeyedArchiveralloc]initForWritingWithMutableData:data];[archiverencodeObject:myObjectforKey:@"keyValueString"];[archiverfinishEncoding];BOOLseccess=[datawriteToFile:@"/path/to/archive"a 阅读全文

posted @  2011-10-28 17:21  Maxfong 阅读(26) |  评论 (0)    编辑

 

UIApplication sharedApplication

摘要: iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示:int UIApplicationMain (int argc,char *argv[],NSString *principalClassName,NSString *delegateClassName); 那么UIApplicationMain函数到底做了哪些事情呢?这个函数主要负责三件 事情:1)从给定的类名初始化应用程序对象,也就是初始化UIApplication或者子类对象的一个实例,如果你在这里给定的是nil,那么 系统会默认UIApplication类,也就主要是这个 阅读全文

posted @  2011-10-21 13:38  Maxfong 阅读(95) |  评论 (0)    编辑

 

UITableView的三种accessory扩展

摘要: 表视图在应用软件开发中会常常用到,应用程序的扩展都是通过选中某行来进行的,但是并不是整 个表视图的每行都会有扩展,所以需要我们以不同的方式去告诉用户。在表视图中是通过一个enum的枚举类型 UITableViewCellAccessoryType来达到这种目的,UITableViewCellAccessoryType声明如下:typedefenum{UITableViewCellAccessoryNone,//don'tshowanyaccessoryviewUITableViewCellAccessoryDisclosureIndicator,//regularchevron.doe 阅读全文

posted @  2011-10-21 11:34  Maxfong 阅读(684) |  评论 (0)    编辑

 

iphone开发基础_分组分区_P165_的理解

摘要: View Code //names表示一个Dictionary,拥有Key(A-Z)和Value(值)//key为Key。--#pragma-//返回有多少组-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{//从A-Z,表示有26行return[keyscount];}//返回每组有多少行-(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section{//根据section参数,得到key的值NSString 阅读全文

posted @  2011-10-19 14:06  Maxfong 阅读(65) |  评论 (0)    编辑

 

tableview的数据源方法,为什么会循环?

摘要: View Code -(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section{//此处执行获取每组有多少行!!从字母A-Z开始!他会从A查询到Z,从Areturn后,再查询一次,returnB的,然后依次类推,执行到Z结束,才是真的结束!!}通过-(NSInteger)numberOfSectionInTableView:(UITableView*)tableView{}的返回值,-(NSInteger)tableView:(UITableView*)tableViewnumber 阅读全文

posted @  2011-10-19 11:14  Maxfong 阅读(110) |  评论 (0)    编辑

 

iphone开发基础_向表视图添加子视图_第八章_P157

摘要: H:View Code #definekNameValueTag1#definekColorValueTag2M: View Code //显示数据-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{//创建一个字符串,作为标识staticNSString*CellTableIdentifier=@"CellTableIdentifier";//dequeueReusableCellWithIdentifier的作用是给cell打个 阅读全文

posted @  2011-10-18 14:30  Maxfong 阅读(177) |  评论 (0)    编辑

 

UILabel的各种属性与方法的使用(转)

摘要: #import "LabelTestViewController.h" @implementation LabelTestViewController /* Accessing the Text Attributes text property font property textColor property textAlignment property lineBreakMode property enabled property Sizing the Label’s Text adjustsFontSizeToFitWidth property ... 阅读全文

posted @  2011-10-18 10:40  Maxfong 阅读(7421) |  评论 (0)    编辑

 

图片查看器:UIScrollView的使用

摘要: 此段代码来自《30天精通iPhone手机编程》,没改代码,只是添加一些注释,供自己查看!!如果哪里错了,希望看见的朋友指出!!H文件View Code #import<UIKit/UIKit.h>#import<Foundation/Foundation.h>@interfaceDay14ViewController:UIViewController@property(nonatomic,retain)IBOutletUIScrollView*scrollView1;@property(nonatomic,retain)IBOutletUIScrollView*scro 阅读全文

posted @  2011-10-14 11:25  Maxfong 阅读(424) |  评论 (0)    编辑

 

scroll view 原理

摘要: scroll view 原理在滚动过程当中,其实是在修改原点坐标当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器,假如在计时器到点后,没有发生手指移动事件,那么,scroll view发送tracking events到被点击的subview假如在计时器到点前,发生了移动事件,那么 scroll view 取消tracking自己发生滚动子类可以重载touchesShouldBegin:withEvent:inContentView: 决定自己是否接收touch事件pagingEnabled当值是YES,会自动滚动到subview的边界,默认是NOtouchesSho. 阅读全文

posted @  2011-10-14 10:21  Maxfong 阅读(24) |  评论 (0)    编辑

 

iphone开发基础_第四章_按钮样式

摘要: //加载前的方法。-(void)viewDidLoad{//加载a.png图片,a图片已加载到资源库。//用做平常状态的按钮样式。UIImage*buttonNormal=[UIImageimageNamed:@"a.png"];//保留12像素的边框,中间拉伸。UIImage*stretchableButtonImageNormal=[buttonNormalstretchableImageWithLeftCapWidth:12topCapeight:0];//btn:按钮名//背景设置为已经配置好的图片(stretchableButtonImageNormal),并指示 阅读全文

posted @  2011-08-18 19:02  Maxfong 阅读(352) |  评论 (2)    编辑

 

VM虚拟机内,控件无法拖拽的问题_解决

摘要: 纠结了一上午!问题:控件无法拖拽,view内没有控件,双击控件进入view无法移动。原因:终于知道原因了,真机内的灵格斯,会影响虚拟机内的鼠标使用。解决:关闭灵格斯就可以了!! 阅读全文

posted @  2011-08-18 12:33  Maxfong 阅读(101) |  评论 (2)    编辑

Objective-C

 

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

摘要: 阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教:copy与retain的区别:copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化.copy减少对象对上下文的依赖。retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝。当然在ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying 协议的类可以发送c 阅读全文

posted @  2012-05-14 17:10  Maxfong 阅读(76) |  评论 (0)    编辑

 

Objective-C基础教程_第十四章_笔记

摘要: IBOutlet和IBAction是AppKit提供的#defint。 IBOutlet没有作用,IBAction的作用为void。 NSTextField就相当于DotNet中的TextBox。 自己添加一个NSObject(相当于创建一个Form),修改其Class为需要的类名。 添加控件并连接,(按钮:我想告诉你谁按了我,并触发什么事情,所以,从我连接到你)。 IBOutlet的工作:当加载NIB文件的时候,NIB中的对象会重新创建,即执行alloc和init,在init期间,IBOutlet都为nil,NIB对象呗创建好后,将创建好的对象的地址添加到类的变量实例中,并向对... 阅读全文

posted @  2011-09-26 10:26  Maxfong 阅读(29) |  评论 (0)    编辑

 

if(self=[super init])的理解

摘要: if(self=[superinit]),实例变量所在的内存位置到隐藏的self的距离是固定的,只影响init方法中self的值,不影响init范围以外的内容。 就是判定父类是否可以实例化,如果父类都出问题了(返回nil),那子类更别说了,对吧!!至于内存位置距离固定,这个不知道是翻译问题还是什么,求指教。 阅读全文

posted @  2011-09-21 13:46  Maxfong 阅读(50) |  评论 (0)    编辑

 

Objective-c中@property(转)

摘要: 声明property的语法为:@property(属性 [, 属性2, ...])类型 名称;属性分为3类:1.读写属性(Writability)包含:readwrite / readonly2.setter语义(Setter Semantics)包含:assign / retain / copy3.原子性(Atomicity)包含:nonatomic下面具体说明各个属性的含义readwrite / readonly:决定是否生成set访问器,readwrite是默认属性,生成getter和setter方法;readonly只生成getter方法,不生成setter方法。readonly关键字 阅读全文

posted @  2011-08-18 19:09  Maxfong 阅读(66) |  评论 (0)    编辑

 

开始学习OBJC

摘要: RT,先看完书,再看看写读后感!! 阅读全文

posted @  2011-08-12 14:11  Maxfong 阅读(18) |  评论 (0)    编辑

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于iOS objectiveC retainCount, OC计数器的思考的详细内容...

  阅读:42次