/**
* 不可变赋值可变 --指针不兼容报警告.
*/
// NSArray *array = [NSArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];
// NSMutableArray *mutableArray = array; --指针不兼容报警告.
//1.解决办法
//NSMutableArray *mutableArray = [array copy]; //不创建新对象.浅拷贝(单纯的指针赋值)-说明虽然可以解决不报警告的问题.但是mutableArray的本质还是不可变的所以不能调用[mutableArray removeObject:@"liuyang"];可以正常打印
/**
打印结果
mutableArray==0x1002049e0 mutableArray=(
liuyang,
xiaoqian
)--array==0x1002049e0 array==(
liuyang,
xiaoqian
)
*/
// //2.解决方法二
// NSMutableArray *mutableArray = [array mutableCopy]; //创新新的mutableArray对象并且是可变的对象.深拷贝-可以调用[mutableArray removeObject:@"liuyang"];方法 mutableArray的内容改变不会影响array的内容
// [mutableArray removeObject:@"liuyang"];
// NSLog(@"mutableArray==%p mutableArray=%@--array==%p array==%@",mutableArray,mutableArray,array,array);
/**
打印结果
mutableArray==0x100210c00 mutableArray=(
xiaoqian
)--array==0x100210ba0 array==(
liuyang,
xiaoqian
)
*/
#pragma mark - situation two : NSArray = NSArray
/**
* 不可变赋值不可变
*/
//situation one : 指针 和内存区域(对象)的 深入理解
//NSArray *array = [NSArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];//现在array指针指向的的对象是0x10020c890内存区域.所以array是可以存储任何内存地址.也就是谁赋值给它.它就指向谁,对谁进行操作.注意赋值之前和之后的指针指向的对象是不同的.
//NSLog(@"%p- %@",array,array);
//NSArray *mutableArray = array;
//array = [mutableArray arrayByAddingObject:@"lyx"]; //数组追加对象返回一个新的数组对象赋值给array指针.这个时候array指针指向的是新数组对象也就是另一个内存区域0x100400080
//situation two :
//NSArray *mutableArray = [array copy]; //单纯的指针赋值 array对象增加了一个指针指向
//NSArray *mutableArray = [array mutableCopy]; //创建新的对象本质是mutableArray是__NSArrayM类型
//NSLog(@"%@",[mutableArray className]);
#pragma mark - situation three : NSArray = NSMutableArray
/**
* 可变赋值不可变 --指针兼容
*/
//NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];
// NSArray *array = mutableArray; //指针兼容单纯指针赋值(指向同一个对象) mutableArray内容改变 array内容也改变
// [mutableArray removeObject:@"liuyang"];
// NSLog(@"%@",[mutableArray className]);
//
// NSArray *array = [mutableArray copy]; //创建新对象__NSArrayI类型 mutableArray内容改变不影响array的内容
// [mutableArray removeObject:@"liuyang"];
// NSLog(@"%@",[array className]);
// NSArray *array = [mutableArray mutableCopy]; //创建新对象__NSArrayM类型 mutableArray内容改变不影响array的内容
// NSLog(@"%@",[array className]);
// [mutableArray removeObject:@"liuyang"];
#pragma mark - situation four : NSMutableArray = NSMutableArray
// NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];
//NSMutableArray *array = mutableArray; //浅拷贝单纯的赋值.指向同一个对象两个指针都可以对对象进行操作.内容都随之改变
//[array removeObject:@"liuyang"];
// //NSLog(@"%@",[array className]); //__NSArrayM
//
// NSMutableArray *array = [mutableArray copy]; //创建新的对象.对象是__NSArrayI类型.内部还是不能调用[mutableArray removeObject:@"liuyang"];会报错 __NSArrayM内部能调用改变数组的方法 内部不随之改变
// NSLog(@"%@",[array className]); //__NSArrayI是NSArray内部类型.
//[array removeObject:@"11"]; //报错__NSArrayI不能调用removeObject方法
//
// NSMutableArray *array = [mutableArray mutableCopy]; //创建新对象对象是__NSArrayM类型内部可以调用改变数组的方法
// NSLog(@"%@",[array className]); //__NSArrayM
// [array removeObject:@"liuyang"]; //内容不随之改变
// NSLog(@"mutableArray==%p mutableArray=%@--array==%p array==%@",mutableArray,mutableArray,array,array);