zoukankan      html  css  js  c++  java
  • ARC 整理

    一,注意事项

    1.不可以使用retain,retainCount,release,autorelease 用@select()这样的调用也不行.属性命名不能以new开头。

    2.若重写一个类子类的dealloc,不应调用[super dealloc],当然也不用写什么release释放一些什么对象,只是处理一些你觉得必要处理的事情吧,比如中止一个还没有完成的网络请求.

    3.不能使用NSAllocateObjectNSDeallocateObject

    4.你不能在c结构中使用对象,更好的方式是使用Objective-c类来代替.

    5.在id和void*之间不能隐士转换,必须指明相应转换的生命周期。

    6.不能使用NSAutoreleasePool对象,ARC使用@autoreleasepool{}块代替。

    7.不能使用内存块,NSZone已经不需要使用了,现在运行时已经忽略之。

    二.基本关键字

    声明变量就会默认赋值nil的.

    strong// 默认的

    相当于retain,在不再使用的时候被释放

    weak

    assign很像,不同在于如果指向的数据被释放了,那么这个指向nil

    unsafe_unretained

    相当于assign,指向的数据如果被释放,这个指向原来的地址

    这些可以定义局部变量__strong __weak __unsage_unretained

    __autor eleasing

    标明传给函数的(id*)型参数是自动释放的,(函数中(id*)型参数默认的也是这种类型)

    1.__autoreleasing不能修饰全局变量,不能修饰类的属性.只能再函数块中用来定义变量,相当与__strong,一旦赋值,直到生命周期结束释放.

    2.对于(id*)型函数参数,默认是__autoreleasing型的,这是由1知道只能传局部变量给函数做实参;如果用__weak修饰,那么会在结束时使的实参为nil,没有意义;__strong修饰可以用全局变量,类的属性值作为参数,其他与__autoreleasing没有区别

    list1

    NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", @"aaa"];
    NSLog(@"string: %@", string);

    打印:(null)

    编译器会给出警告.程序第一句申请了一个内存,赋值给string,然后weak引用的string并没有retain这个内存,这个内存赋值后在块内并没有再次使用,他的周期就存在与赋值语句内部,所以释放,然后string指向的内存被释放所以他是nil.

    list2

    @property(nonatomic,strong) NSString* stringA;
    @property(nonatomic,weak) NSString* stringB;
    
    - (void)a {
        self.stringA = @"string A";
        self.stringB = stringA;
        self.stringA = nil;
        NSLog(@"%@",stringB);
    }
    
    -(void)b{
        self.stringA = [NSString stringWithFormat:@"%@",@"string A"];
        self.stringB = stringA;
        self.stringA = nil;
        NSLog(@"%@",stringB);
    }
    
    - (void)c {
        self.stringA = [[NSString alloc] initWithFormat:@"%@",@"string A"];
        self.stringB = stringA;
        self.stringA = nil;
        NSLog(@"%@",stringB);
    }
    

    这三个函数分别输出什么呢?都是"string A".那么在函数执行完之后呢?stringB对应的值是什么?

    a:string A// 常字符串存储在静态存储区,stringB指向的那个不会被释放

    b:(null)// stringA指向那块自动释放的内存再块结束时释放

    c:(null)// stringA就是指向分配字符串的内存,赋予nil会释放那块内存

    btw:第一次试验的时候块内就已经是块外的值了.囧..

    三.Toll-Free Bridging

    Core Foundation 对象Objective-c对象之间的赋值,函数调用参数相互转化时需要用到的关键字

    __bridge

    简单赋值,不会影响两边对象的retain count.

    __bridge_transfer

    赋值后释放右边的对象

    __bridge_retained

    赋值后也保留不释放右边的对象

    举例:

    -(void)test  
    {
    CFStringRef coreFoundationString = CFStringCreateWithCString(CFAllocatorGetDefault(),"C String", kCFStringEncodingUTF8); // 创建 retainCount = 1
    id unknownObjectType = (__bridge id)coreFoundationString; // 简单赋值,不变,retainCount = 1
    CFStringRef anotherString = (__bridge_retained CFStringRef)unknownObjectType; // 保留赋值,加一,retainCount = 2
    NSString *objCString = (__bridge_transfer NSString *)coreFoundationString; // 释放赋值,减一,retainCount =1;由于NSString*默认strong,加一,retainCount = 2
    NSLog(@"String = %@", objCString);
    objCString = nil; // 不再指向原内存,原内存减一,retainCount = 1
    CFRelease(anotherString); // 释放,减一,retainCount = 0
    }

    四.其他

    1.开关 :-fobjc-arc -fno-objc-arc 编译标识来指明单个文件的方式.

    整个工程转向ARC可以选中工程->菜单edit->refactor->convert to Objective-c ARC

    2.除了nibTop-Level(main nib文件里面的对象,除了File's owner

      Application)对象,其他的IBOutlet最好都是weak型的.

    3.如果一定要实现类的自定义的retain和release,那么同时也要在类中加入

    -(BOOL)supportsWeakPointers { return NO; }

    4.c型的结构中使用objective-c对象

    使用void*代替id;或者使用__unsage_unretained 修饰objective-c对象

    5.不能zeroing-weak引用的类有

    SATSTypesetter, NSColorSpace, NSFont, NSFontManager, NSFontPanel, NSImage, NSMenuView, NSParagraphStyle, NSSimpleHorizontalTypesetter, NSTableCellView, NSTextView, NSViewController, NSWindow, and NSWindowController.

    他们的对象,作为属性,使用assign代替weak;作为变量,使用__unsafe_unretained代替__weak

    ARC下也不能weak引用NSHashTable, NSMapTable, or NSPointerArray

    6. __block修饰的变量默认也是__strong引用的.

    推荐学习:

    http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

    http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2

    参考:

    https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html#//apple_ref/doc/uid/TP40011226

    iOS5 programming cook book

  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/v2m_/p/2269408.html
Copyright © 2011-2022 走看看