zoukankan      html  css  js  c++  java
  • 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 retainCountOC计数器
    摘要: 阅读本文之前首先了解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)  编辑
     
    摘要: 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)  编辑
     
    摘要: 表视图在应用软件开发中会常常用到,应用程序的扩展都是通过选中某行来进行的,但是并不是整 个表视图的每行都会有扩展,所以需要我们以不同的方式去告诉用户。在表视图中是通过一个enum的枚举类型 UITableViewCellAccessoryType来达到这种目的,UITableViewCellAccessoryType声明如下:typedefenum{UITableViewCellAccessoryNone,//don'tshowanyaccessoryviewUITableViewCellAccessoryDisclosureIndicator,//regularchevron.doe阅读全文
    posted @ 2011-10-21 11:34 Maxfong 阅读(684) | 评论 (0)  编辑
     
    摘要: 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)  编辑
     
    摘要: 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)  编辑
     
    摘要: 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)  编辑
     
    摘要: #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)  编辑
     
    摘要: 此段代码来自《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发送tracking events到被点击的subview假如在计时器到点前,发生了移动事件,那么 scroll view 取消tracking自己发生滚动子类可以重载touchesShouldBegin:withEvent:inContentView: 决定自己是否接收touch事件pagingEnabled当值是YES,会自动滚动到subview的边界,默认是NOtouchesSho.阅读全文
    posted @ 2011-10-14 10:21 Maxfong 阅读(24) | 评论 (0)  编辑
     
    摘要: //加载前的方法。-(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)  编辑
     
    摘要: 纠结了一上午!问题:控件无法拖拽,view内没有控件,双击控件进入view无法移动。原因:终于知道原因了,真机内的灵格斯,会影响虚拟机内的鼠标使用。解决:关闭灵格斯就可以了!!阅读全文
    posted @ 2011-08-18 12:33 Maxfong 阅读(101) | 评论 (2)  编辑

    Objective-C

     
    摘要: 阅读本文之前首先了解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)  编辑
     
    摘要: 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=[superinit]),实例变量所在的内存位置到隐藏的self的距离是固定的,只影响init方法中self的值,不影响init范围以外的内容。 就是判定父类是否可以实例化,如果父类都出问题了(返回nil),那子类更别说了,对吧!!至于内存位置距离固定,这个不知道是翻译问题还是什么,求指教。阅读全文
    posted @ 2011-09-21 13:46 Maxfong 阅读(50) | 评论 (0)  编辑
     
    摘要: 声明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)  编辑
     
    摘要: RT,先看完书,再看看写读后感!!阅读全文
    posted @ 2011-08-12 14:11 Maxfong 阅读(18) | 评论 (0)  编辑
  • 相关阅读:
    在 ML2 中 enable local network
    实践 Neutron 前的两个准备工作
    配置 linux-bridge mechanism driver
    为 Neutron 准备物理基础设施(II)
    两张图总结 Neutron 架构
    Service Plugin / Agent
    详解 ML2 Core Plugin(I)
    #define用法集锦[修正版]
    socketpair理解
    判断单链表是否存在环,判断两个链表是否相交-的相关讨论
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2979427.html
Copyright © 2011-2022 走看看