NSMutableArray 被copy、strong修饰后的变化
2017-02-21 17:24
387 查看
一、源对象为可变对象 NSMutableArray * arrayTemp = [NSMutableArray
array];
1、@property(nonatomic,strong)NSMutableArray
* array;
//array 用Strong修饰,只是指针引用,内存地址不变,类型也不变,均为原先的类型
NSMutableArray * arrayTemp = [NSMutableArray
array];
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:0x610000052c00-------self.array:0x610000052c00
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:__NSArrayM------self.array:__NSArrayM
2、@property(nonatomic,copy)NSMutableArray
* array1;
//array1 用COPY修饰,则为拷贝,拷贝出一块新内存来,由可变变为不可变,类型变化
NSMutableArray * arrayTemp = [NSMutableArray
array];
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:0x610000052c00-------self.array:0x61000000c980
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:__NSArrayM------self.array:__NSArray0
3、@property(nonatomic,strong)NSArray
* array;
NSMutableArray * arrayTemp = [NSMutableArray
array];
//array 用Strong修饰,只是指针引用,内存地址不变,类型也不变,均为原先的类型
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
2017-02-21 17:33:49.090 内存管理[5617:1719357] arrayTemp:0x610000055330-------self.array:0x610000055330
2017-02-21 17:33:49.090 内存管理[5617:1719357] arrayTemp:__NSArrayM------self.array:__NSArrayM
4、
@property(nonatomic,copy)NSArray * array1;
NSMutableArray * arrayTemp = [NSMutableArray
array];
//array1 用COPY修饰,则为拷贝,拷贝出一块新内存来,由可变变为不可变,类型变化
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:33:49.090 内存管理[5617:1719357] arrayTemp:0x610000055330-------self.array1:0x61800000ec90
2017-02-21 17:33:49.091 内存管理[5617:1719357] arrayTemp:__NSArrayM------self.array1:__NSArray0
二、源对象为不可变对象时 NSArray * arrayTemp = [NSArray
array];
1、@property(nonatomic,strong)NSMutableArray
* array;
//array 用Strong修饰,内存地址均不变,类型也不便
NSArray * arrayTemp = [NSArray
array];
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
2017-02-21 17:27:17.518 内存管理[5561:1672059] arrayTemp:0x6100000146d0-------self.array:0x6100000146d0
2017-02-21 17:27:17.518 内存管理[5561:1672059] arrayTemp:__NSArray0------self.array:__NSArray0
2、
//array1 用COPY修饰,内存地址均不变,类型也不便,均为不可变数组
NSArray * arrayTemp = [NSArray
array];
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:27:17.518 内存管理[5561:1672059] arrayTemp:0x6100000146d0-------self.array1:0x6100000146d0
2017-02-21 17:27:17.519 内存管理[5561:1672059] arrayTemp:__NSArray0------self.array1:__NSArray0
3、4、地址不变,全部为不可变数组
@property(nonatomic,strong)NSArray
* array;
@property(nonatomic,copy)NSArray
* array1;
NSArray * arrayTemp = [NSArray
array];
//array 用Strong修饰,只是指针引用,内存地址不变,类型也不变,均为原先的类型
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
//array1 用COPY修饰,则为拷贝,拷贝出一块新内存来,由可变变为不可变,类型变化
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:0x600000007f00-------self.array:0x600000007f00
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:__NSArray0------self.array:__NSArray0
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:0x600000007f00-------self.array1:0x600000007f00
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:__NSArray0------self.array1:__NSArray0
综上所述:
修饰可变类型时,一般用strong,不用copy,否则可能会导致由可变变为不可变类型,导致系统崩溃,当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。
array];
1、@property(nonatomic,strong)NSMutableArray
* array;
//array 用Strong修饰,只是指针引用,内存地址不变,类型也不变,均为原先的类型
NSMutableArray * arrayTemp = [NSMutableArray
array];
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:0x610000052c00-------self.array:0x610000052c00
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:__NSArrayM------self.array:__NSArrayM
2、@property(nonatomic,copy)NSMutableArray
* array1;
//array1 用COPY修饰,则为拷贝,拷贝出一块新内存来,由可变变为不可变,类型变化
NSMutableArray * arrayTemp = [NSMutableArray
array];
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:0x610000052c00-------self.array:0x61000000c980
2017-02-21 17:21:51.742 内存管理[5515:1636890] arrayTemp:__NSArrayM------self.array:__NSArray0
3、@property(nonatomic,strong)NSArray
* array;
NSMutableArray * arrayTemp = [NSMutableArray
array];
//array 用Strong修饰,只是指针引用,内存地址不变,类型也不变,均为原先的类型
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
2017-02-21 17:33:49.090 内存管理[5617:1719357] arrayTemp:0x610000055330-------self.array:0x610000055330
2017-02-21 17:33:49.090 内存管理[5617:1719357] arrayTemp:__NSArrayM------self.array:__NSArrayM
4、
@property(nonatomic,copy)NSArray * array1;
NSMutableArray * arrayTemp = [NSMutableArray
array];
//array1 用COPY修饰,则为拷贝,拷贝出一块新内存来,由可变变为不可变,类型变化
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:33:49.090 内存管理[5617:1719357] arrayTemp:0x610000055330-------self.array1:0x61800000ec90
2017-02-21 17:33:49.091 内存管理[5617:1719357] arrayTemp:__NSArrayM------self.array1:__NSArray0
二、源对象为不可变对象时 NSArray * arrayTemp = [NSArray
array];
1、@property(nonatomic,strong)NSMutableArray
* array;
//array 用Strong修饰,内存地址均不变,类型也不便
NSArray * arrayTemp = [NSArray
array];
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
2017-02-21 17:27:17.518 内存管理[5561:1672059] arrayTemp:0x6100000146d0-------self.array:0x6100000146d0
2017-02-21 17:27:17.518 内存管理[5561:1672059] arrayTemp:__NSArray0------self.array:__NSArray0
2、
//array1 用COPY修饰,内存地址均不变,类型也不便,均为不可变数组
NSArray * arrayTemp = [NSArray
array];
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:27:17.518 内存管理[5561:1672059] arrayTemp:0x6100000146d0-------self.array1:0x6100000146d0
2017-02-21 17:27:17.519 内存管理[5561:1672059] arrayTemp:__NSArray0------self.array1:__NSArray0
3、4、地址不变,全部为不可变数组
@property(nonatomic,strong)NSArray
* array;
@property(nonatomic,copy)NSArray
* array1;
NSArray * arrayTemp = [NSArray
array];
//array 用Strong修饰,只是指针引用,内存地址不变,类型也不变,均为原先的类型
self.array = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array:%p",arrayTemp,self.array);
NSLog(@"arrayTemp:%@------self.array:%@",[arrayTemp
class],[self.array
class]);
//array1 用COPY修饰,则为拷贝,拷贝出一块新内存来,由可变变为不可变,类型变化
self.array1 = arrayTemp;
NSLog(@"arrayTemp:%p-------self.array1:%p",arrayTemp,self.array1);
NSLog(@"arrayTemp:%@------self.array1:%@",[arrayTemp
class],[self.array1
class]);
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:0x600000007f00-------self.array:0x600000007f00
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:__NSArray0------self.array:__NSArray0
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:0x600000007f00-------self.array1:0x600000007f00
2017-02-21 17:39:16.391 内存管理[5662:1759004] arrayTemp:__NSArray0------self.array1:__NSArray0
综上所述:
修饰可变类型时,一般用strong,不用copy,否则可能会导致由可变变为不可变类型,导致系统崩溃,当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。
相关文章推荐
- iOS内存管理(6)--NSArray与NSMutableArray用copy修饰还是strong
- NSMutableArray的strong改成copy就崩溃
- OC语言-NSMutableArray为什么要用strong来修饰
- NSString为什么用copy而不是strong,NSMutableString为什么用strong而不是用copy(或者NSArray及NSMutableArray等)
- OC的深拷贝与浅拷贝--NSArray与NSMutableArray应该使用copy还是strong?
- 为什么NSMutableArray必须用strong,而NSArray必须用copy?
- iOS @property (copy) NSMutableArray *array;用copy、strong出现问题
- 为什么NSMutableArray必须用strong,而NSArray必须用copy?
- 属性修饰copy;copy、mutableCopy;NSCopying NSMutableCopying
- @property (copy) NSMutableArray *array; 这个写法会出什么问题
- 用@property (copy) NSMutableArray *array;会有什么问题?
- 这个写法会出什么问题: @property (copy) NSMutableArray *array;
- NSMutableArray等容器类的Copy注意事项
- NSArray、NSMutableArray的copy、mutableCopy
- Objective-C Copy语法(一)对于Objective-C 提供的类对象NSString/NSMutableString; NSArray/NSMutableArray...
- @property (copy) NSMutableArray *array; 这个写法会出什么问题
- 给NSMutableArray添加copy属性就变成了NSArray
- NSMutableArray使用copy声明所产生内存泄漏的问题
- iOS 杂笔-25(不要用copy修饰NSMutableString)
- [bugfix]copy属性参数将NSMutableArray变为NSArray类型