美文网首页IOS开发者心得
使用ARC时的一些注意事项

使用ARC时的一些注意事项

作者: 白纸上涂鸦 | 来源:发表于2016-03-28 15:41 被阅读113次

1.ARC空声明变量

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

NSObject myObject1,myObjects2;

不过要注意的是,与其他高级编程语言不同,ARC不会自动将标量的值设置为零。
  这意味着以下几行代码声明的变量其值并不等于零:

int a;
int b;


2.Objective-C命名约定

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


3.覆盖默认行为

虽然从技术上说我们无法覆盖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;
};

微博链接

相关文章

  • 使用ARC时的一些注意事项

    1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的。这意味着像下面这样的声明使用...

  • #define Weakself(weakSelf) __we

    // 不知道这行代码的使用场景的同学你该去自习看看ARC的注意事项和Block的使用了 // 1、__weak _...

  • ARC环境下的内存管理

    一、ARC强制实施的新规则 为了工作,ARC强加了一些在使用其他编译器模式时不存在的新规则。这些规则旨在提供一个完...

  • FMDB之间的使用

    ARC 和 MRC 项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目时自...

  • weak引用计数问题

    ARC MRC 原因 ARC下使用__weak修饰符的变量时,该变量会被自动注册到autoreleasepool中...

  • 如何混合使用ARC和非ARC

    如果你的项目使用的非ARC模式,则为ARC模式的代码文件加入-fobjc-arc标签。如果你的项目使用的ARC模式...

  • arc什么时候起作用?

    arc什么时候起作用?arc就是让编译器进行内存管理, 编译器能立即释放不再被使用的对象, arc是编译时的特征....

  • 【code_hyy_工具】arc/mrc混用

    一.mrc下使用arc 1.自己的旧项目没有使用ARC,但是引入的第三方库却是使用了ARC的。给采用了ARC的源文...

  • 16_自动引用计数

    在 Swift 使用 ARC 与在 Obejctive-C 中使用 ARC 类似,具体请参考过渡到 ARC 的发布...

  • 02 Object-C之ARC

    以上,都是目前对ARC的一些浅显认知,先知道如何使用吧。

网友评论

    本文标题:使用ARC时的一些注意事项

    本文链接:https://www.haomeiwen.com/subject/esvjlttx.html