一赞弥、深拷貝和淺拷貝
在對象進(jìn)行copy操作的時候伐债。如果只復(fù)制了對象的指針,那么拷貝就屬于淺拷貝木羹。如果對對象的內(nèi)容進(jìn)行了拷貝甲雅。那么拷貝過程就屬于深拷貝了。下面分別對NSString汇跨、NSArray务荆、NSDictionary什么時候進(jìn)行淺拷貝什么時候進(jìn)行深拷貝進(jìn)行分析。
1.NSString:
NSString *baseStr = @"默認(rèn)的字符串";
NSString *copyStr = [baseStr copy];
NSString *mutableCopyStr = [baseStr mutableCopy];
NSLog(@"%p---%p---%p",baseStr,copyStr,mutableCopyStr);
控制臺輸出信息為
2.NSMutableString:
NSMutableString *mutableStr = [NSMutableString stringWithString:@"默認(rèn)的字符串"];
NSString *baseStr = [mutableStr copy];
NSMutableString *mutableBaseStr = [mutableStr mutableCopy];
NSLog(@"%p---%p---%p",mutableStr,baseStr,mutableBaseStr);
控制臺輸出信息為
NSString結(jié)論:
通過分析可得對NSString進(jìn)行copy操作進(jìn)行的是淺拷貝穷遂、mutableCopy操作進(jìn)行的是深拷貝。
對于NSMutableString進(jìn)行的copy和mutableCopy都是深拷貝娱据。
3.NSArray
NSArray *array = @[@"baseStr",@"baseStr2",@"baseStr3"];
NSArray *copyArray = [array copy];
NSArray *mutableCopy = [array mutableCopy];
NSLog(@"%p---%p---%p",array,copyArray,mutableCopy);
控制臺輸出為
最終確認(rèn)NSArray和NSDictionary進(jìn)行copy
4.NSMutableArray
NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithArray:@[@"aaa",@"bbb",@"ccc"]];
NSArray *copyArray = [mutableArray copy];
NSArray *mutableCopy = [mutableArray mutableCopy];
NSLog(@"%p---%p---%p",mutableArray,copyArray,mutableCopy);
控制臺輸出為
結(jié)論:經(jīng)驗(yàn)證NSString蚪黑、NSArray、NSDictionary進(jìn)行copy都是淺拷貝(指針拷貝)中剩、mutableCopy是深拷貝(內(nèi)存拷貝)
二:@property使用copy和strong的區(qū)別
property使用copy和strong的區(qū)別
我們以字符串的處理為例進(jìn)行講解
NSString的情況下進(jìn)行判斷
(1)使用copy的情況
@interface ViewController ()
@property (nonatomic, copy) NSString *defaultCopyString;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSMutableString *mutableString = [NSMutableString stringWithString:@"baseString"];
self.defaultCopyString = mutableString;
[mutableString appendString:@"123"];
NSLog(@"%@",self.defaultCopyString);
}
控制臺輸出為
2018-01-30 14:39:28.283170+0800 PropertyCopyStrong[4378:559212] baseString
分析可得通過copy修飾的defaultCopyString字符串在進(jìn)行賦值的時候忌穿,是將可變字符串進(jìn)行了copy操作。對進(jìn)行了內(nèi)存的深拷貝结啼。重新占用了一塊內(nèi)存地址掠剑。所以當(dāng)對可變字符串進(jìn)行處理的時候〗祭ⅲ可以發(fā)現(xiàn)defaultCopyString并沒有發(fā)生改變朴译。
(2)使用strong修飾的情況
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSString *defaultCopyString;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSMutableString *mutableString = [NSMutableString stringWithString:@"baseString"];
self.defaultCopyString = mutableString;
[mutableString appendString:@"123"];
NSLog(@"%@",self.defaultCopyString);
}
控制臺輸出為:
2018-01-30 14:42:27.591001+0800 PropertyCopyStrong[4400:560825] baseString123
通過分析可得當(dāng)修飾符為strong的時候。并沒有進(jìn)行拷貝操作属铁。只是將可變字符串mutableString的引用計(jì)數(shù)進(jìn)行+1.內(nèi)存地址并沒有發(fā)生改變眠寿。當(dāng)對可變字符串進(jìn)行處理的時候defaultCopyString也同步發(fā)生了變化。
經(jīng)驗(yàn)證NSArray和NSDictionary具有跟NSString相同的特性焦蘑。如果涉及到可變數(shù)組和可變字典之間的相互轉(zhuǎn)換并且涉及到數(shù)組和字典的變化時盯拱。最好使用copy來修飾。