郑州影楼网站建设,广州越秀网站建设公司,购买网站空间的方法,域名解析服务器今天和同事在处理一处用strong声明的Block属性引发的问题时偶然发现的。在诸多教程中都会讲到#xff1a;声明属性时用strong或者retain效果是一样的#xff08;貌似更多开发者更倾向于用strong#xff09;。不过在声明Block时#xff0c;使用strong和retain会有截然不同的…今天和同事在处理一处用strong声明的Block属性引发的问题时偶然发现的。在诸多教程中都会讲到声明属性时用strong或者retain效果是一样的貌似更多开发者更倾向于用strong。不过在声明Block时使用strong和retain会有截然不同的效果。strong会等于copy而retain竟然等于assign 当然定义Block还是应该用copy还有其他需要注意的地方可以参考这篇文章iOS: ARC和非ARC下使用Block属性的问题因为非ARC下不copy的Block会在栈中ARC中的Block都会在堆上的。 可以这样复现问题。在非ARC环境下定义一个简单类型定义一个Block属性先用正确的copy 1 interface TestCls : NSObject
2
3 property (nonatomic, copy) void(^myBlock)();
4
5 end 在另一个类型里声明变量 1 TestCls *_testObj 然后在一个方法里比如viewDidLoad中设置Block变量注意即便是在非ARC下没有引用外部变量的Block类型也是__NSGlobalBlock__而引用外部变量的Block才是__NSStackBlock__如下代码 1 _testObj [[TestCls alloc] init];
2
3 int outerVar 12;
4
5 _testObj.myBlock ^void()
6 {
7 NSLog(Block被调用%d, outerVar);
8 };
9 NSLog(Block类型%, [_testObj.myBlock class]); 然后在另一个方法里比如UIButton的点击事件方法里去执行Block如下 1 _testObj.myBlock(); 测试环境是Xcode 6/iOS 7/8如果最上面myBlock属性声明是copy或者strong的话Block都会被copy输出 Block类型__NSMallocBlock__ Block被调用12 如果上面myBlock属性声明是retain或者assign的话Block表现起来就是assign没有去copy输出 Block类型__NSStackBlock__ 此时可能会CrashBAD_ACCESS也有可能输出错误的值我在控制台下测试会出现这种情况。因为Block作用域在函数栈里而函数已经执行完毕了。 总之strong和retain竟然有不一样的地方而声明Block属性请务必用copy。 转载于:https://www.cnblogs.com/fengmin/p/5390073.html