//
// main.m
// coy
//
// Created by New-World on 13-11-3.
// Copyright (c) 2013年 Gary. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
// NSMutableArray *muatbleArray=[[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
// NSMutableArray *muarray2=[muatbleArray retain];
// [muarray2 removeLastObject];
// NSLog(@"%@",muatbleArray);
// NSLog(@"%ld",[muatbleArray retainCount]);
#pragma mark copy和retain的区别
//copy是创建了一个新的对象,retain是原来的对象引用计数加一
// NSMutableArray *muatbleArray=[[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
// NSMutableArray *muarray2=[muatbleArray mutableCopy];
// [muarray2 removeLastObject];
// NSLog(@"%@",muatbleArray);
// NSLog(@"%@",muarray2);
// NSLog(@"%ld",[muatbleArray retainCount]);
#pragma mark copy和mutablecopy的区别
// //copy是返回了一个不可变对象副本,mutablecopy是返回了一个可变对象副本
// NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3",nil];
// NSArray *arraycopy=[array copy];
// NSMutableArray *mutablearray=[array mutableCopy];
// [muatbleArray addObject:@"4"];//muatbleArray可变数组方法,arraycopy无此方法
// NSLog(@"arraycopy %@",arraycopy);
// NSLog(@"mutablearray %@",mutablearray);
#pragma mark 深拷贝和浅拷贝的区别
//浅拷贝只复制对象本身,深拷贝不仅复制对象本身,对象的属性也会被复制
//Foundation框架中支持复制的类,默认是浅复制
//一个数组包含了许多对象,复制一个数组的副本,那么数组元素是没复制的,指向的还是同一个对象
NSMutableArray *array1=[[NSMutableArray alloc] initWithCapacity:3];
for (int i=0; i<3; i++) {
NSObject *obj=[[NSObject alloc] init];
[array1 addObject:obj];
[obj release];
}
for (NSObject *o in array1 ) {
NSLog(@"array1指针地址%p :reatainCount:%lu",o,[o retainCount]);
}
NSArray *newArray=[array1 copy];
for (NSObject *o in newArray) {
NSLog(@"newArray指针地址%p :reatainCount:%lu",o,[o retainCount]);
}
[newArray release];
[array1 release];
#pragma mark 自定义拷贝
//自定义拷贝必须遵守NSCopying和NSMutableCopying协议,实现copywithZone方法
// -(id)copyWithZone:(NSZone *)zone{
// /**********浅拷贝************/
// Person *person =[[[self class] allocWithZone:zone] init];
// person.name=_name;
// person.age=_age;
// return person;
//
// /**********深拷贝************/
// Person *person =[[[self class] allocWithZone:zone] init];
// person.name=[_name copy];
// person.age=[_age copy];
// return person;
// }
//Foundation可复制的对象,当我们Copy(不是mutableCopy)的是一个不可变的对象时,它的作用相当于retain
//三点必要条件:1.它是Founddation对象2.它是不可变对象3.进行Copy操作
NSArray *arraya=[[NSArray alloc] initWithObjects:@"1",@"2",@"q", nil];
NSArray *arrayb=[arraya copy];
NSLog(@"数组一地址%p,%lu",arraya, arraya.retainCount);
NSLog(@"数组二地址%p,%lu",arrayb, arrayb.retainCount);
}
return 0;
}