注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

WA!Peter

广州天河, 香港火炭,深圳罗湖, 北京国贸

 
 
 

日志

 
 

iPhone dev note: memory and retainCount etc  

2009-10-22 22:05:47|  分类: iphone |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

 

 

Memory

NSMutableDictionary 的 removeAllObjects 是会对于所有child 发出 release, 也就是说

retainCount--,   建议 child 在 dictionary 内, 应该尽量保持 retainCount  = 1, 除非你是做 cache

或特殊应用.   检查的方法很简单:

/////////////////////////////// START ////////////////////////////////

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

MYCLASS * obj = [[MYCLASS alloc] init];  // MYCLASS 是我们自己写的

NSString *key = [NSString stringWithFormat:@"hey%d", 3];

[dict setObject:obj  forKey:key];

[obj release];  // 一般需要这句, 除非你知道自己在做什么

assert(([dict objectForKey:key] retainCount] == 1);   // 你试试comment 掉 [obj release];

[dict release];   //  好习惯, 那里 alloc, 那里 release

///////////////////////// END ///////////////////////////////

另外, 你会发现, 为啥 NSString *key 不用 release?  因为NSString 本身没有alloc, 是built-in auto-release,

只要你是在本地变量中使用, 完成函数, 返回后, 就会自动release.  自己定义的class没有这个优惠.

我们进行图片cache 的时候, 要注意图片(UIImage*) 的 retainCount, 很多时候会发现 BAD ACCESS是因为在画图途中, 图片的retainCount 变成 0 (或更小).

 

NSFileHandle *handle;  , 一般不用 release,  只要 [handle closeFile];  这个关闭档案, 但是不会dealloc

memory, 因为会自动dealloc(auto-release).  

static initializer:

+ (void) initialize  {

    // do something like static {  }  in Java!

}

测试一个class(例如NSString*)是否有auto-release 功能:

// class name:  TestAutoRelease

static NSString * globalStr;   // just a pointer

+ (void) testOne {

        NSString * str = [NSString stringWithFormat:@"three:%d", 3];

        globalStr = str;

        NSLog(@"testOne rc1 = %d", [globalStr retainCount]);

        [str retain];

        NSLog(@"testOne rc2 = %d", [globalStr retainCount]);

        // do not release str and globalStr

+ (void) testTwo {

        NSLog(@"testTwo rc = %d", [globalStr retainCount]);

}

/// execution sequence:

// [TestAutoRelease testOne];

// [TestAutoRelease testTwo];

// expected reason:

testOne rc1 = 1

testOne rc2 = 2

testTwo rc = 2     

/// 最后 rc=1 证明 testOne 内的 local variable NSString *str 是在函数跑完后 releaseCount  不会减少!!

 

Hotkey

Control-3   来回于 .m / .h 之间, 在 .m 中, 是看是否有  #import, Control-3 就是 #import 的列表

 

 

Note:

iPhone 3.1.2<=>Xcode 3.2.1   是对应的, Xcode 3.2 不能下载app到真机测试(iPhone 3.1.2)

 

  评论这张
 
阅读(266)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017