oc81--copy内存管理

//
//  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
原文地址:https://www.cnblogs.com/yaowen/p/7442540.html