1.内存管理

2021-08-18  本文已影响0人  LucXion

自己生成对象并 自己持有:alloc、new、copy、mutableCopy

自己生成对象但 不持有(需要持有需 retain、或者 autorelease->订阅到自动释放池):[NSArray array]

释放非自己持有的对象会造成崩溃

内存管理的基础方法:alloc、release、retain、dealloc

头部内存管理计数与计数表管理计数的区别

autorelease

aotorelease的作用,就是将已分配的对象添加到自动释放池,在自动释放池作用域结束的时候,给自动释放池内的所有对象调用release方法

ARC所有权修饰符 __unsafe_unretained

    /*
     __unsafe_unretained
     是不安全的所有权修饰符
     与weak相同的地方在于他们都不会持有对象
     与weak不同的地方在于他不会自动将已释放的对象置为nil
     */
    id __unsafe_unretained obj1 = nil;
    
    {
        id __strong obj2 = [NSObject new];
        obj1 = obj2;
        NSLog(@"作用域内 %@",obj1);
    }
    // 此处为访问野指针崩溃
    NSLog(@"作用域外 %@",obj1);

所有权修饰符 __autorelesing

__autorelesing

CoreFoundation框架与Foundation框架通过免费桥转换

CFTypeRef CFBridgingRetain(id X){
    return (__bridge_retained CFTypeRef)X;
}

id CFBridgingRelease(CFTypeRef X){
    return (__bridge_transfer id)X;
}
// CF桥接到F
    CFMutableArrayRef cfArr = NULL;
    {
        NSMutableArray *ocArr = [[NSMutableArray alloc]init];
        cfArr = CFBridgingRetain(ocArr);
        CFShow(cfArr);
        printf("retain count = %d\n",CFGetRetainCount(cfArr));
    }
    printf("out scope retain count = %d\n",CFGetRetainCount(cfArr));
    CFRelease(cfArr);

// F桥接到CF
    CFMutableArrayRef cfArr = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
    printf("retain count = %d\n",CFGetRetainCount(cfArr));
    id ocArr = CFBridgingRelease(cfArr);
    printf("retain count = %d\n",CFGetRetainCount(cfArr));

属性

属性
上一篇 下一篇

猜你喜欢

热点阅读