// // main.m // Copy内存管理(MRC才有内存管理) // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str1 = @"lnj"; char *cstr = "this is a c string"; NSString *str1 = [[NSString alloc] initWithUTF8String:cstr]; NSLog(@"str = %lu", [str1 retainCount]); // 1 // 不会产生新对象, 所以会对原有对象进行一次retain NSString *str2 = [str1 copy]; // 2 NSLog(@"str = %lu", [str1 retainCount]); // 注意点: 如果是浅拷贝, 那么会对被拷贝的对象进行一次retain, 那么我们就需要对拷贝出来的对象进行一次release [str2 release]; // 1 [str1 release]; // 0 char *cstr = "this is a c string"; NSString *str1 = [[NSString alloc] initWithUTF8String:cstr]; NSLog(@"str1 = %lu", [str1 retainCount]); // 1 // 会生成一个新的对象 NSMutableString *str2 = [str1 mutableCopy]; NSLog(@"%p %p", str1, str2); NSLog(@"str2 = %lu", [str2 retainCount]); // 1 [str1 release]; [str2 release]; /* 内存管理的原则, 有加就有减 一次alloc/retain/copy 对应一次release */ } return 0; }
// // ViewController.m // 18-copy内存管理(MRC才有内存管理) // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; /* 内存管理原则: 一次alloc 对应一次release 一次retain 对应一次 release 一次copy 对应一次release 有加就有减 总结: 如果是浅拷贝:不会生成新的对象,但是系统就会对原来的对象进行retain, 所以需要对原来的对象进行一次 如果是深拷贝:会生成新的对象,系统不会对原来的对象进行retain,但是因为生成了新的对象,所以我们需要对新的对象进行release */ //1.创建一个不可变字符串 NSString *str = [[NSString alloc]initWithFormat:@"lnj"]; NSLog(@"str = %lu", [str retainCount]); /* */ //不会生成新的对象,但是需要注意,正是因为不会生产新的对象,所以系统会对以前的对象进行一次retain //如果是浅拷贝,那么系统就会对原来的对象进行retain NSString *str2 = [str copy]; NSLog(@"str = %lu", [str retainCount]); [str release]; [str release]; //深拷贝:会生成新的对象,正是因为会生成新的对象,所以系统不会对以前的对象进行retain,但是因为生成了新的对象,所以我们需要对新的对象进行release NSMutableString *strM = [str mutableCopy]; NSLog(@"str = %lu", [str retainCount]); NSLog(@"strM = %lu", [strM retainCount]); NSLog(@"%p - %p", str, strM); [strM release]; [str release]; } @end