Copy and 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;  
}  





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值