zoukankan      html  css  js  c++  java
  • iOS开发系列-Foundation与CoreFoundation内存管理

    概述

    对于初学者来说,可能仅只能将ARC用在objective-c对象上(也即继承自NSObject的对象),但是如果涉及到较为底层的东西,比如Core Foundation中的malloc()或者free()等,ARC就鞭长莫及了,这时候还是需要自己手动进行内存管理。

    ARC下Foundation与CoreFoundation内存管理

    - (void)ARCChange{
    
        // Foundation --> CoreFoundation框架数据类型的转换
        NSString *str = [[NSString alloc] init];
        // (__bridge CFStringRef) 等同于MRC下的直接转换,不会移交对象的内存管理
        //     CFStringRef strRef = (__bridge CFStringRef)str;
        
        // 这种方式转换,会移交对象的内存管理权
        CFStringRef strRef = (__bridge_retained CFStringRef)(str);
        NSLog(@"%@", strRef);
        CFRelease(strRef);
        
        
        // CoreFoundation ----> Foundation框架的数据类型转换
        CFStringRef strRef2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "123", kCFStringEncodingUTF8);
        // (__bridge CFStringRef) 等同于MRC下的直接转换,不会移交对象的内存管理
        //    NSString *str2 = (__bridge NSString *)strRef2;
        //    NSLog(@"%@", str2);
        //    CFRelease(strRef2);
        
        // 这种方式转换,会移交对象的内存管理权
        // CFBridgingRelease == __bridge_transfer NSString *
        //    NSString *str2 = (__bridge_transfer NSString *)strRef2;
        NSString *str2 = CFBridgingRelease(strRef2);
        NSLog(@"%@", str2);
    }
    

    MRC下Foundation与CoreFoundation内存管理

    - (void)MRCChange{
        // Foundation ---> CoreFoundation
        
        NSString *str = [[NSString alloc] init];
        // CFStringRef 这种转换 属于直接转换 不会移交对象的内存管理
        CFStringRef strRef = (CFStringRef)str;
        
        NSLog(@"%@", strRef);
        [str release];
        
        // CoreFoundation 到 Foundation框架的数据类型转换
        CFStringRef strRef2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "123", kCFStringEncodingUTF8);
        // 这种转换,属于直接转换 不会移交对象的内存管理
        NSString *str2 = (NSString *)strRef2;
        
        NSLog(@"%@", str2);
        CFRelease(strRef2);
    }
    
  • 相关阅读:
    进程的两种开启方法,进程的常用方法,进程的常用属性
    并发编程简介
    周鸿祎:互联网成功十大案例
    sed用法详解
    awk与sed:一个关于多行处理的例子
    igmpproxy源代码学习——igmpProxyInit()
    获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
    unix网络编程——ioctl 函数的用法详解
    九大排序算法再总结
    浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n
  • 原文地址:https://www.cnblogs.com/CoderHong/p/9113026.html
Copyright © 2011-2022 走看看