shitou's blog 

  • Home
  • About
  • Feed
  • 十人族
  • MIX BOY
  • 塌客

Category "iPhone"

14
May

copy和mutableCopy

指针,内存管理,都是学习objc所要面对的新东西,iPhone基础开发教程看到第8章了,8.7搜索栏实现的第一个方法就把我搞爽了,在 ruby, php中一个简单的变量赋值为什么在这里就要搞的这么雄伟壮观呢,没办法,看官方doc, 写了个小例子有助于理解,下面的例子反映了objc的一些基本用法(同php, ruby相比), 也是以后需要注意的,这里只做简单解释,如果下面的例子都让你发晕,你还是先看更基础的objc的书吧,推荐learn objective-c on mac

#import "Foundation/Foundation.h"

int main(int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

 

//a1是用原始方法初始化创建的,因此a1的内存管理由你负责,下面的变量也是如此, 基本上所有通过init之类方法初始化的变量都需要 自己维护变量的引用计数器,用完就要release

NSArray *a1 = [[NSArray alloc] initWithObjects:@"NSArray a1", nil];

 

//只是把指针赋予a2, 该指针的类型是NSArray, 现在a1和a2所指向的是同一块内存单元,就是指向的数值一样,只是引用不一样,就相当于一个文件你创建了两个快捷方式(或者是linux上的soft link), 因此你修改任何一个值等于同时修改另一个的值

NSArray *a2 = a1;

 

//这里输出结果一样
NSLog([a1 description]);
NSLog([a2 description]);

 
NSMutableArray *a3 = [[NSMutableArray alloc] initWithObjects:@"NSMutableArray: a3", nil];
NSMutableArray *a4 = a3;
[a3 addObject:@"element2"];

 

//输出结果一样
NSLog([a3 description]);
NSLog([a4 description]);

 

//这里才是像php, ruby中的赋值一样,把a3赋予a5, 不同的指针不同的内存地址引用,完全copy
NSMutableArray *a5 = [a3 copy];
[a3 addObject:@"element3"];

 

//只有a5中有element3
NSLog([a3 description]);
NSLog([a5 description]);


NSMutableArray *a6 = [[NSMutableArray alloc] init];

 

//把a3中的元素放入a6, 这里只是数据的放入,不会保留mutable和immutable信息
[a6 addObjectsFromArray:a3];

 

//注意下面的autorelease, 即把含有a, b的数组加入a6中后,自行释放,就是交给程序去管理了
[a6 addObject:[[[NSArray alloc] initWithObjects:@"a", @"b", nil] autorelease]];
NSLog([a6 description]);
NSLog([[a6 objectAtIndex:[a6 count] - 1] description]);

 

 //创建a6的可变拷贝赋给a7, 只有有mutable, immutable区分的对象才有mutableCopy方法, 即如果这个地方你用的是copy即使a6是mutable, a7也是immutable
NSMutableArray *a7 = [a6 mutableCopy];
[a6 insertObject:@"element4" atIndex:3];
NSLog([a6 description]);

[a7 insertObject:@"first" atIndex:0];
//this will be error, because the last element is not mutable array
//[[a7 objectAtIndex:[a7 count] - 1] addObject:@"c"];
//this will create the mutable copy

 

//上面注释掉的操作是会出错的,因为a, b数组是immutable, 下面就是创建它的mutable拷贝, 也就是iPhone基础开发教程 8.7开始那个函数实际要做的,只是它是递归调用的
NSMutableArray *ma = [[a6 objectAtIndex:[a6 count] -1] mutableCopy];
[a7 replaceObjectAtIndex:[a7 count] - 1 withObject:ma];

 

//现在就可以操作了
[[a7 objectAtIndex:[a7 count] - 1] addObject:@"c"];

NSLog([a7 description]);


 
//上面的变量哪些要手工release, 哪些由release pool管理,就不多说了
[a1 release];
[a3 release];
[a5 release];
[a6 release];
[a7 release];
[ma release];
[pool release];
return 0;
}

Tags: objective-c

2009-05-14 14:40:47, 1581 reviews, comment

send to mailbox

Your email:

Related Posts

用gcc编译objective-c

GNUstep的安装

Autorelease in a Loop

TOP

Tags

json Impactjs Canvas fun gen_server superfly PS3 Webgame HTML5 jquery SSH tenerer MooseFS gearman-ruby Gearman MongoDB MochiChat TCP U-ka saegusa IN db command Mai Kuraki Norah Jones log iPhoneException ACG Mac Safari objective-c CouchDB LVS AJAX debian 推荐 AMQP google mail bug gettext Erlang 北京 iptables 架构 tips mysql backup function 我看 postfix 监控 SEO cache Etag memcache thread 进程 线程 无锡 yield file column mixboy xml rss gems ruby shitou shell lighttpd 安全 csrf 公司 nginx linux 模块 apache webserver 朋友 大学 生活 尼古拉斯凯奇 movie 文件同步 笑笑 歌词 auto complete plugin rails music ubuntu blog

Category

  • HTML5[3]
  • iPhone[17]
  • Erlang[11]
  • google[13]
  • 生活[45]
  • 音乐[13]
  • 电影[11]
  • linux[29]
  • web server[6]
  • mail server[3]
  • cluster[1]
  • system manage[9]
  • ruby[20]
  • ruby on rails[28]
  • 开源[4]

Episode

  • MongoDB
  • MochiChat
  • iPhoneException
  • shell
  • thread
  • memcache


Popular Posts

  • 准备开始学习Erlang了(恶狼, 二郎..)
  • Ruby遍历MemCached的key
  • 服务器监控小脚本
  • MySQL Innodb备份
  • [转载]5个有用的ruby gems

Recommended Posts

  • Tri-survive - HTML5 Game
  • Cut the rope - HTML5版
  • json_formatter
  • 在gen_server中spawn新的进程
  • Superfly - Wildflowers
  • 继续凸墙 for Mac OS
  • MongoDB Beijing 2011
  • MongoDB删除map_reduce生成的tmp collection
  • Mai Kuraki - Future Kiss
  • Erlang OOP
  • 用SSH tunnel凸墙
  • Google的语法高亮工具包
  • 大量数据的批量操作
  • 再次被和谐-_-
  • 十人族: 上线了

Friends' blogs

  • levy
  • sphance
  • andreas
  • yangkunlun
  • {:dev=>:wxianfeng}
  • bheye
  • joeydarko

Login

   注册

留言 查看留言

留言

   取消

留言 查看留言


Statistics

  • 访问次数: 316245
  • 今天访问: 40
  • 日志: 213
  • 评论: 4967
  • 音乐: 9
  • 用户: 1758


少年,不点下广告吗!

 

all by shitou

blog comments powered by Disqus

close