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);
}

猜你喜欢

转载自www.cnblogs.com/CoderHong/p/9113026.html