• 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

  • 相关阅读:
    移动项目开发笔记(禁止一个按钮在服务器事件处理完成前连续点击按钮)
    网页设计div+css之id与class使用原则
    Windows Media Encode 9简介及SDK
    酒桌上的规矩,社会的潜规则
    实现最小宽度的几种方法及CSS Expression
    Css的zindex属性与Flash动画层叠需注意
    asp.net很有用的字符串操作类
    生活中的几种心态
    Silverlight监测工具:Silverlight Spy
    silverlight为控件注册属性
  • 原文地址:https://www.cnblogs.com/v2m_/p/2269408.html
Copyright © 2020-2023  润新知