zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    js对象的直接赋值、浅拷贝与深拷贝
    如何使ElementUi中的el-dropdown传入多参数
    机器学习之垃圾邮件分类2
    机器学习之手写数字识别-小数据集
    机器学习之深度学习-卷积
    机器学习之朴素贝叶斯-垃圾邮件分类
    机器学习之分类与监督学习,朴素贝叶斯分类算法
    机器学习之主成分分析(PCA&特征选择)
    机器学习之逻辑回归实践
    机器学习之特征选择
  • 原文地址:https://www.cnblogs.com/yaowen/p/7442540.html
Copyright © 2011-2022 走看看