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

WA!Peter

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

 
 
 

日志

 
 

函数返回Object的讨论  

2010-02-28 17:45:01|  分类: iphone |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Objective-C function design, 关于返回值的方法

返回一个字符串:   必须用 autorelease, 或利用+ 模式的字符串函数
- (NSString *)getDisplayName  {
    return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
}
或者:
- (NSString *)getDisplayName  {
    NSString *displayName;
    displayName = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName] autorelease];
    // 如果觉得太长, 可以把autorelease 分开, 放在return [displayName autorelease];
    return displayName;   
}


返回一个NSArray (或NSMutableArray),  就是一堆Object, 有两种design pattern:
1. 直接返回, 必须要autorelease
- (NSArray *) getNameArray  {
     NSMutableArray *nameArray = [[NSMutableArray alloc] init] autorelease];
    [nameArray addObject:@"pacess"];
    [nameArray addObject:@"hua"];
    [nameArray addObject:@"peter"];
    return nameArray;
}

2. 代入法返回, 一般需要清空
- (int) fillNameArray:(NSMutableArray *) nameArray {
    [nameArray removeAllObjects];  // 这个可以按需要选择是否清空
    [nameArray addObject:@"pacess"];
    [nameArray addObject:@"hua"];
    [nameArray addObject:@"peter"];
    return [nameArray count];  // 或按照实际能放入的object数量
}

为什么有时候会偏向使用2.代入法?
对于部分 Container class, 拥有一个 NSMutableArray, 例如  World 类拥有NSMutableArray *playerArray
透过property(nonatomic, readonly) 去处理,  外部只能读取 world.playerArray 指针, 不能修改指针
(但是可以修改内容).     在 World 初始化的时候 init:  创建 playerArray = [[NSMutableArray alloc] init],
World 删除后 dealloc:   [playerArray release], 符合一般container class 的做法.   有些界面,  例如
PlayerListView 用来显示所有用户, 这个UI 类利用 retain 的方法保存 playerArray, 之后一直显示所有
player (例如显示名字列表).  如果这个world.playerArray 被其他logic取代了, 则PlayerListView的界面
会一直保持旧的playerArray,  不会更新数据。    利用2。代入法模式, 则可以保证 playerArray
这个指针对应的内容是自有永有, PlayerListView只要按需求 refresh 就可以更新名字列表.

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

历史上的今天

评论

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

页脚

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