关于IOS中ARC 整理 [转]

一,注意事项
  1.不可以使用retain,retainCount,release,autorelease 用@select()这样的调用也不行.属性命名不能以new开头。
  2.若重写一个类子类的dealloc,不应调用[super dealloc],当然也不用写什么release释放一些什么对象,只是处理一些你觉得必要处理的事情吧,比如中止一个还没有完成的网络请求.
  3.不能使用NSAllocateObject和NSDeallocateObject
  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.除了nib的Top-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引用的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值