iOS学习笔记29-__block 与 __weak的区别理解
来源:互联网 发布:智能电视专用软件 编辑:程序博客网 时间:2024/06/05 04:20
Blocks理解:
Blocks可以访问局部变量,但是不能修改
如果修改局部变量,需要加__block
<pre name="code" class="hljs cs" style="overflow:auto; font-family:Consolas,Menlo,Monaco,'Courier New',monospace; font-size:0.92857em; padding:10px; margin-top:18px; margin-bottom:18px; line-height:1.3; word-break:break-all; word-wrap:break-word; color:rgb(101,123,131); border:none; position:relative; max-height:500px; background:rgb(246,246,246)">__block <span class="hljs-keyword" style="color:#85990;">int</span> multiplier = <span class="hljs-number" style="color:#2aa198;">7</span>; <span class="hljs-keyword" style="color:#85990;">int</span> (^myBlock)(<span class="hljs-keyword" style="color:#85990;">int</span>) = ^(<span class="hljs-keyword" style="color:#85990;">int</span> num) { multiplier ++;<span class="hljs-comment" style="color:#93a1a1;">//这样就可以了</span> <span class="hljs-keyword" style="color:#85990;">return</span> num * multiplier; };
2、如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,block只修改指针上的内容。如:
<span class="hljs-built_in" style="color:#268bd2;">NSMutableArray</span> *mArray = [<span class="hljs-built_in" style="color:#268bd2;">NSMutableArray</span> arrayWithObjects:<span class="hljs-string" style="color:#2aa198;">@"a"</span>,<span class="hljs-string" style="color:#2aa198;">@"b"</span>,<span class="hljs-string" style="color:#2aa198;">@"abc"</span>,<span class="hljs-literal" style="">nil</span>]; <span class="hljs-built_in" style="color:#268bd2;">NSMutableArray</span> *mArrayCount = [<span class="hljs-built_in" style="color:#268bd2;">NSMutableArray</span> arrayWithCapacity:<span class="hljs-number" style="color:#2aa198;">1</span>]; [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(<span class="hljs-keyword" style="color:#85990;">id</span> obj,NSUInteger idx, <span class="hljs-built_in" style="color:#268bd2;">BOOL</span> *stop){ [mArrayCount addObject:[<span class="hljs-built_in" style="color:#268bd2;">NSNumber</span> numberWithInt:[obj length]]]; }]; <span class="hljs-built_in" style="color:#268bd2;">NSLog</span>(<span class="hljs-string" style="color:#2aa198;">@"%@"</span>,mArrayCount);
__weak __typeof(&*self)weakSelf =self; 等同于
__weak UIViewController *weakSelf =self;
为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。
扩展:NSTimer注意避免循环引用的地方,需要找个合适的时机和地方来 invalidate timer
在引用计数的环境里面,默认情况下当你在block里面引用一个Objective-C对象的时候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被retain。但是被__block存储类型修饰符标记的对象变量不会被retain
注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 如果你在实现方法的时候使用了block,对象的内存管理规则更微妙:也是(__weak与__block区别:)
1、如果你通过引用来访问一个实例变量,self会被retain。
2、如果你通过值来访问一个实例变量,那么变量会被retain
版权声明:本文为博主原创文章,未经博主允许不得转载。
0 0
- iOS学习笔记29-__block 与 __weak的区别理解
- iOS开发之 __block 与 __weak的区别理解
- __block 与 __weak的区别理解
- __block 与 __weak的区别理解
- __block与__weak的区别理解
- __block 与 __weak的区别理解
- __block 与 __weak的区别理解
- __block 与 __weak的区别理解
- __block 与 __weak的区别理解
- __block 与 __weak的区别理解 补充
- __block 与 __weak的区别理解
- __weak 与 __block的区别理解
- iOS __block 与 __weak区别
- __weak与__block的区别
- [iOS]__weak与__block修饰符的区别
- ios __block与__weak
- __weak与__block区别
- __weak与__block区别
- Tenth Line
- 利用Hog特征和SVM分类器进行行人检测
- get请求
- Sublime Text 2下安装SFTP插件
- 第三周顺序表的应用(1)
- iOS学习笔记29-__block 与 __weak的区别理解
- Linux高可用性方案之Heartbeat安装
- nyoj 68 三点顺序
- VS2015中配置Pthread
- SRM 668 DIV 2 IsItASquare 600-point
- Qt 与 xcode 7版本的问题
- iOS 使用safari
- spring MVC配置详解
- 关于dp,sp,px之间转换的小工具类