__block在arc和非arc下含义一样吗?

Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block)。

比如这样一个Block类型:

typedef void (^MyBlockType)(int);

@property (copy) MyBlockType myBlock;
if (self.myBlock)
{
    //此时,走到这里,self.myBlock可能被另一个线程改为空,造成crash
    //注意:atomic只会确保myBlock的原子性,这种操作本身还是非线程安全的
    self.myBlock(123);
}
MyBlockType block = self.myBlock;
//block现在是本地不可变的
if (block)
{
    block(123);
}
//非ARC
MyBlockType block = [self.myBlock retain];
if (block)
{
    block(123);
}
[block release];

返回目录 2. 循环引用问题

在ARC下,由于__block抓取的变量一样会被Block retain,所以必须用弱引用才可以解决循环引用问题,iOS 5之后可以直接使用__weak,之前则只能使用__unsafe_unretained了,__unsafe_unretained缺点是指针释放后自 己不会置空。示例代码:

//iOS 5之前可以用__unsafe_unretained //__unsafe_unretained typeof(self) weakSelf = self; __weak typeof(self) weakSelf = self; self.myBlock = ^(int paramInt) { //使用weakSelf访问self成员 [weakSelf anotherFunc]; };

//非ARC
__block typeof(self) weakSelf = self;
self.myBlock = ^(int paramInt)
{
    //使用weakSelf访问self成员
    [weakSelf anotherFunc];
};
时间: 2024-10-25 21:14:24

__block在arc和非arc下含义一样吗?的相关文章

iOS: ARC和非ARC下使用Block属性的问题

1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block). 另一个需要注意的问题是关于线程安全,在声明Block属性时需要确认“在调用Block时另一个线程有没有可能去修改Block?”这个问题,如果确定不会有这种情况发生的话,那么Block属性声明可以用nonatomic.如果不肯定的话(通常情况是这样的),那么你首先需要声明Blo

大钟的ios开发之旅(2)————简单说说ios中ARC与非ARC模式下的property的变量修饰词

/******************************************************************************************** * author:[email protected]大钟 * E-mail:[email protected] *site:http://www.idealpwr.com/ *深圳市动力思维科技发展有限公司 * http://blog.csdn.net/conowen * 注:本文为原创,仅作为学习交流使用,转

(知其所以然 主题2)从底层分析OC中ARC和非ARC下深复制和浅复制

今天,在坊间听到有人在争论OC中关于NSString的深浅复制,听了下,感觉很有必要来一个分析总结,让我们从底层去了解OC中深浅复制的运作机制. 所谓copy就是在原有对象的基础上产生一个副本对象,遵循最关键的两点原则: 1. 改变原对象的属性和行为不会对副本对象产生任何影响 2. 改变副本对象的属性和行为不会对原对象产生任何影响 在理解了这一层之后,我们一起来研究下deep copy 和 shallow copy,因为苹果是一个非常注重性能的公司,所以拷贝在底层实现没那么简单: 以NSStri

IOS ARC和非ARC文件混用

ARC在SDK4.0的时候加入的,由于要和以前的项目融合,就会有arc和非arc文件的混合. 当然,也就这两种情况: 1.自己的旧项目没有使用ARC,但是引入的第三方库却是使用了ARC的. 2.自己的新项目使用了ARC,但是引入代码却没有使用ARC. 这两种情况下,直接肯定是通不过编译的.可以通过升级旧项目,让其使用ARC来解决,但这个办法有时候会很麻烦. 有一个简单的办法就是,可以指定单个文件是否采用ARC来进行编译. 方法就是在Build Phase里面的Compile Source里面找到

ARC 与非ARC 之间的转换,以及如何使一个项目中,ARC与非ARC共存

1,非ARC 转 ARC的操作 XCode 的 Edit -- Refactor -- Convert to Object-C ARC (注意,一般在一个大项目中,很少直接使用此方法,其正确率有待考虑,毕竟手动内存管理较为复杂,如果出现错误,很难排查) 2,ARC 与 非ARC共存 需求来源:当我们在项目中使用一些古老的框架时,该框架就可能使用手动内存管理.而公司开发的项目可能采取ARC.此时如何将两者整合到一起? 解决方法:选中改项目---Build Phase -- 双击非ARC 文件,输入

内存管理总结-ARC和非ARC

序言 ObjC内存管理分为两个阶段: Xcode4之前,ObjC的内存管理就需要由开发人员手动维护,内存的管理需要开发人员自己调用内存管理的方法,所以被称为MRC(Manual Reference Counting),即非ARC. Xcode4之后,ObjC的内存管理就不需要由开发人员手动维护,系统会自定在合适的时机或位置帮助开发人员调用内存管理的方法,所以被称为ARC(Automatic Reference Counting). 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在

iOS中ARC和非ARC混用

如果在使用第三方类库的时候,我们可能会遇到一些内存管理的问题 那么如何在一个工程中实现ARC和非ARC混用呢,例如你创建一个ARC的工程,但是你引用的第三方类库是非ARC管理内存的 首先点击工程 然后选择Build Phases 最后,在想要修改为非ARC的文件名的右面的Compiler Flags中 添加-fno-objc-arc即可 另一种简单的方法(Edit -> Refactor -> convert to Objective-C ARC,消灭这些警告) 同理,如果你想你创建一个非AR

让ios项目同时支持ARC和非ARC

ttp://code4app.com/snippets/one/禁止某几个文件用ARC模式编译/502344256803fa246d000000#s0 如果你的绝大部分代码需要ARC,那么就设置项目支持ARC,然后对于一些不需要ARC的文件,在要禁止ARC编译的源文件的 “compiler flags” 中添加 “-fno-objc-arc”. 对于 Xcode 4, 可以在 target -> Build Phases -> Compile Sources 中找到“compiler flag

-fobjc-arc,使ARC与非ARC一块工作

ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target, 2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc-fobjc-arc,使ARC与非ARC一块工作 ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target, 2,选Build Phases,在其中Complie So

ARC与非ARC混用

使ARC与非ARC一块工作 ARC与非ARC在一个项目中同时使用1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc