文档章节

(iOS) __block和__weak认识

青卷三部
 青卷三部
发布于 2016/11/08 16:46
字数 1073
阅读 41
收藏 1
点赞 0
评论 0

果然还是对最基础的知识了解不透彻,今天看一看iOS中的两个修饰符:_____block和_____weak 。也是做一下温习吧。

1、先说weak,<弱引用>

我们知道weak的使用,比如声明一个控件属性,就会用到weak。

看代码:<code>@property(nonatomic,weak)UILabel *label;</code>

当然这并不是说声明控件就一定使用weak,相反的我在手动创建控件是大多数会使用strong。但如果你比较细心的话,你会发现我们使用xib时,使用的却是weak这一属性。那问题来了,我们使用strong 和 weak 的时机是何时呢?咱们接着往下看。<!--more-->

从storyboard 或者xib上创建控件

  • 在控件放在view上的时候,已经形成了如下的引用关系,以UILabel为例:UIViewController->UIView->subView-> UILabel 然后你为这个UILabel声明一个weak属性

<code>@property(nonatomic,weak) IBOOutlet UILabel * label;</code>

相当于xib对这个label是强引用,你声明的属性对它是弱引用。

手动创建控件

  • a). 将控件声明成strong <code>@property(nonatomic,strong) UIlabel * label;</code>

那么你在实现这个控件时只需这样:

<pre></code>_label = [[UIlabel alloc]init]; [self.view addSubview:_label]</code></pre>

  • b). 将控件声明成weak <code>@property(nonatomic,weak) UIlabel * label;</code> 那么你在实现这个控件时需要这样:

<pre><code>UIlabel *label = [[UIlabel alloc]init]; _label = label; [self.view addSubview:_btn];</code></pre>

关于block循环引用的问题

由于block会复制外部的变量,所以如果不注意,就会造成循环引用。对于这种情况,需要将引用的一方变成weak,从而避免循环引用。 看代码:

<pre><code> BlocksViewController *blockVC = [[BlocksViewController alloc]init]; __weak ViewController *weekSelf = self; /** * 1、使用弱引用来解决block循环引用问题 * * 2、block能截取自动变量,并且是不能在block块中进行修改的(除非用 __block修饰符)这里的 weekSelf.textField.text 的值是被修改了,并且没有使用 __block修饰符。原因是因为textField是全局变量,如果定义一个局部变量,比如:定义个 “text”是不能被修改的,编译器会报错, */ //block回调传值 [blockVC returnValue:^(NSString *content) { weekSelf.textField.text = content; // text = content;//这里会提示错失__block; }]; </code></pre>


2、strong和weak的区别

  • strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。
  • weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。
  • strong和copy是用来修饰强引用的属性,weak 用来修饰弱引用的属性;
  • strong、weak 需要ARC支持才能使用,copy不需要ARC支持
  • strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;

3、关于__block

先看一段代码:<pre><code> @autoreleasepool { __block NSInteger value = 0; void (^block)(void) = ^{ value = 1; }; block(); NSLog(@"val = %ld", value); }</code></pre> 我们现在看着可能得不出什么结论,那么,我们再看下面的代码,为了直观,我以图片的形式呈现:

picture1:

picture2: 现在对比就明显了。

下面总结一下:

  • 1.__block对象在block中是可以被修改、重新赋值的。

  • 2.__block对象在block中不会被block强引用一次,从而不会出现循环引用问题。

  • 3.blocks可以访问局部变量,但是不能修改。 如果修改局部变量,需要加__block ,所以__block 是让修改外部变量的值.

  • 对于 block 外的变量引用,block 默认是将其复制到其数据结构中来实现访问的

const-non-local-variables

  • 对于用 __block 修饰的外部变量引用,block 是复制其引用地址来实现访问的

mutable-non-local-variables

4、__block 和 __weak修饰符的区别:

  • 1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。

  • 2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。

  • 3.__block对象可以在block中被重新赋值,__weak不可以。


链接:

谈Objective-C block的实现:

Blocks are Objective-C`s:

iOS开发-由浅至深学习block:

© 著作权归作者所有

共有 人打赏支持
青卷三部
粉丝 0
博文 8
码字总数 8364
作品 0
浦东
iOS工程师
Xcode ARC需要什么版本的环境支持

Mac OS X v10.6 和 v10.7 (64位应用) 的Xcode 4.2以上版本支持ARC,iOS 4 和 iOS 5 下ARC都能工作,但Weak不支持Mac OS X v10.6 和 iOS 4,所以要想在iOS 4下运行用ARC的程序,只能用strong。...

东方皓
2013/05/06
0
0
iOS查看屏幕帧数工具--YYFPSLabel

学习 YYKit 代码时,发现 ibireme 在项目里加入的一个查看当前屏幕帧数的小工具,效果如下: 挺实用,实现方法也很简单,但是思路特别棒。 这里是Demo: YYFPSLabel 这里我把这个小工具从 中...

yehot
2016/04/05
0
0
iOS使用Objective-c自定义cordova插件(二)

接上一章. 中还有其它的配置、、、以及配置文件. eg: 框架: <framework src="CFNetwork.frame" weak="true"/> plist文件: <resource-file src="src/ios/PushConfig.plist"/> 默认的info.plis......

Michaelyn
2017/10/23
0
0
经过阿里,百度一面,二面后,我总结了50道iOS面试题

前言: 金三银四已经过去,根据统计,很多人都会选择在三月四月跳槽,原因有很多,企业年后会有大量员工离职,员工觉得老公司待遇不怎么样?薪资不够高,想换个新环境等等原因,所以,三月四...

原来是泽镜啊
05/04
0
0
arc 与 非arc的编译开关

Use Compiler Flags to Enable and Disable ARC You enable ARC using a new -fobjc-arc compiler flag. You can also choose to use ARC on a per-file basis if it’s more convenient for......

JohnZr
2012/09/18
0
0
说说 NSTimer 的新 API

本文是我首发在iOS知识小集团队的,欢迎关注微博话题#ios知识小集#。 在以往的 iOS 版本中,我们为了避免 NSTimer 的循环引用问题,一个比较常用的解决办法是为 NSTimer 添加一个 category,...

halohily
05/03
0
0
iOS精美过度动画、视频会议、朋友圈、联系人检索、自定义聊天界面等源码

iOS精选源码 iOS 精美过度动画源码(http://www.code4app.com/thread-14827-1-1.html) iOS简易聊天页面以及容联云IM自定义聊天页面的实现思路(http://www.code4app.com/thread-30348-1-1.htm...

sunnyaigd
07/11
0
0
iOS中结合代码看内存管理(一)

阅读本文前,建议移步先去了解下内存管理相关知识。 1: iOS内存管理机制(百度goole大法可以获得很多推荐)。 2: iOS中的动态内存分配 3: 堆栈的原理:堆栈 百科 1:自动释放池的常见问题: ...

Nlinger
2017/06/07
0
0
iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song
05/25
0
0
UIViewPropertyAnimator 简介(一)

目前在 UIKit 至少有三种创建动画的方法。iOS 4 之前的 begin/commit 方式,以及在 iOS 4 中引入的 block 方式。在 iOS 10 发布的时候,UIKit 新增了一个创建动画的专用类 UIViewPropertyAn...

智小融
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
24分钟前
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部