IOS6学习笔记(三)

1.ARC空声明变量编程

  使用ARC的另外一个优点是全部未初始化的变量默认都是“空值化”的。这意味着像下面这样的声明使用ARC编译后指向的是空值(nil):编程语言

  NSObject *myObject1,*myObjects2;ui

  不过要注意的是,与其余高级编程语言不一样,ARC不会自动将标量的值设置为零。spa

  这意味着如下几行代码声明的变量其值并不等于零:指针

  int a;orm

  int b;对象

2.Objective-C命名约定内存

  若是你在Person对象中写了一个叫作newPersonName的方法,ARC会认为该方法返回一个分配过的对象。使用ARC(或者不适用ARC)编译过的调用代码和方法newPersonName运行时一切正常。可是若是这一方法所在的类没有使用ARC编译而调用方法使用了ARC编译,程序就会奔溃。反过来,若是newPersonName方法是使用ARC编译的而调用代码没有,就会出现内存泄露。编译器

3.覆盖默认行为it

  虽然从技术上说咱们没法覆盖LLVM的行为,但仍是可使用Clang源标注NS_RETURNS_RETAINED和NS_RETURNS_NOT_RETAINED来更改方法。newPersonName方法能够像下面这样标注,以告诉ARC编译器:尽管该方法名称前面是new,返回的倒是未保留过的对象指针。

  -(NSString *)newPersonName NS_RETURNS_NOT_RETAINED;

 4.自由桥接

  与Objective-C库不一样,咱们在Objective-C中使用的标准C语言和Core Fundation类库(CF *方法)不会遵循那些命名约定。这意味着ARC编译器没法百分百地释放不须要的内存。在ARC出现以前,我么能够将CF*对象强制转变成NS*对象,这称为自由桥接(toll-free bridging)。也就是说,咱们能够将CFString*经过类型转换变成NSString*类型。而有了ARC,咱们便没法再这么作了,至少不指定一个全部权转移修饰符时确实如此。

  ARC容许使用一下这些全部权转移修饰符:

  __bridge

  __bridge_retained

  __bridge_transfer

  1.__bridge

  它告诉ARC不要增长它的引用计数的值,也不要更改全部权。

  2.__bridge_retained

  若想要转换C指针类型并增长引用计数的值,咱们可使用第二个修饰符。当要从Objective-C方法(它建立一个Core Fundation对象并在以后使用CFRelease方法将其释放)返回一个保留过的指针时,咱们可使用这个修饰符。若是Objective-C方法属于NSRETURNS_RETAINDED系列,就要返回保留过的指针。

  3.__bridge_transfer

  若是要将Core Fundation指针类型转换成Objective-C指针并为引用计数加1,可使用最后一个修饰符。若Core Fundation方法建立一个对象,而且想要靠ARC来管理对象的内存,咱们即可以使用这个修饰符。

5.忽略performSelector警告

  #pragma clang diagnostic push

  #pragma clang diagnostic ignored "-Warc-performSelector-leaks"

                [uiViewController performSelector:finishMethod withObject:request];

  #pragma clang diagnostic pop

 

6.block引发的循环保留

  使用__block避免循环保留(无ARC)

  __block id safeSelf = self;

  self.myBlock = ^(NSString* returnedString){

  safeSelf.labelControl.text = returnedString;

  };

  ARC会改变__block的语义,所以不该该使用它。在ARC中,__block引用会被保留而不是被复制,这意味着在ARC环境中前面的代码仍然会引起循环保留。正确地方法是使用__weak或(__unsafe_unretained)引用,如:

  

  使用__weak避免循环保留(有ARC)  

  __weak typeof(self) safeSelf = self;//IOS 5+

  //__unsafe_unretained typeof(self) safeSelf = self;//IOS 4+

  self.myBlock = ^(NSString* returnedString){

  safeSelf.labelControl.text = returnedString;

  };

相关文章
相关标签/搜索