【IOS学习】iOS——Block中 __block、__weak 、typeof、define等词的小解释
2016-07-12 20:08
405 查看
一、typeof概述
(1)typeof这个东西并不是ISO/IEC 9899:1999里的,也就是说不是标准C的运算符,这是gcc的一个扩展。可以看成一个一元运算符。(2)typeof是一个什么东西,怎么用?
typeof和sizeof用法非常类似!
sizeof(exp.)返回的是exp.的数据类型大小;
typeof(exp.)返回的就是exp.的数据类型。exp.可以是任意类型,所以返回的也是和exp.对应的任意类型。
通俗的说就是:可以根据typeof()括号里面的变量,自动识别变量类型并返回该类型。
二、typeof的使用
在iOS中的使用,常见运用于Block 。下面看一个典型的用法:
__block typeof(self) bself = self;
[self methodBlock:^ {
[bself doSomething];
}
代码解释:定义一个和self相同数据类型的bself ,并赋值为self,在block中使用
三、Block中其他字的使用解释
在block中,我们是用__block
和
__weak
避免循环引用.
block对于其变量都会形成强引用(retain),对于self也会形成强引用(retain) ,而如果self本身对block也是强引用的话,就会形成 强引用 循环,无法释放——造成内存泄露。,所以我们会使用
__block typeof(self) bself = self;// MRC __weak typeof(self) weakself = self;//ARC
四、延伸
为了方便,不用每次都要写这样一句固定代码,我们将这句代码定义了宏:#define WeakSelf __weak typeof(self) weakSelf = self;//WeakSelf 宏名,weakSelf 变量名
之后,我们可以比较方便的在需要的地方:
WeakSelf; 。。。。。。 [weakSelf doSomething];
(1)不止self需要使用weak,可能有部分变量也需要weak
#define WeakObj(o) __weak typeof(o) o##Weak = o;
(2)让我们的这个宏看起来更原生一些,我们添加了@符号在前面:
#define WeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o;
在block中调用self会引起循环引用,但是在block中需要对weakSelf进行strong,保证代码在执行到block中,self不会被释放,当block执行完后,会自动释放该strongSelf。
strong宏:
#define StrongObj(o) autoreleasepool{} __strong typeof(o) o = o##Weak; @WeakObj(self); [var setBlock:^{ @StrongObj(self); [self doSomething]; }];
五、实际使用
1.weakSelf:LoginViewController *loginVC = [[LoginViewController alloc]init]; __weak __typeof(self) weakSelf = self; loginVC.loginFinished = ^(){ [weakSelf doSomeThing];//使用多次的话,就需要strongSelf }; [self.navigationController pushViewController:loginVC animated:YES];
2.strongSelf
LoginViewController *loginVC = [[LoginViewController alloc]init]; __weak __typeof(self) weakSelf = self;//block内部多次使用 loginVC.loginFinished = ^(){ __strong __typeof(self) strongSelf = weakSelf; [strongSelf doSomeThing]; [strongSelf doOtherThing]; }; [self.navigationController pushViewController:loginVC animated:YES];
3、宏定义用法
#define WeakObject(obj) __weak typeof(obj) weakObject = obj; #define StrongObject(obj) __strong typeof(obj) strongObject = weakObject; WeakObject(self); loginVC.loginFinished = ^(){ [weakObject doSomeThing];//使用多次的话,就需要strongSelf }; WeakObject(self); loginVC.loginFinished = ^(){ StrongObject(self) [strongObject doSomeThing]; [strongObject doSomeThingElse]; };
typeof和typedef很像,事实上,只要能用typedef的地方就可以用typeof。
typeof构造中的类型名不能包含存储类说明符,如extern或static
C语言中typeof详解可参考:
http://blog.csdn.net/gneveek/article/details/8761196
文/艳晓(简书作者)
原文链接:http://www.jianshu.com/p/f27038845143
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- iOS 【沙盒目录及文件存储相关】
- iOS 【Multithreading-多图下载数据展示案例(二级缓存)/模拟SDWebImage内部实现】
- IOS Dev Intro - Category
- IOS Dev Intro - Block
- IOS Dev Intro - Property
- ReboundScrollView 仿IOS 拖拽回弹
- IOS Dev Intro - NSSet
- socket连接库,兼容ipv6,ipv4,为IOS上架做准备
- IOS Dev Intro - NSBundle
- IOS Dev Intro - NSFileManager
- IOS Dev Intro - Sandbox
- iOS 给图片加标识符,通过标识符来区分图片
- opencv-ios开发笔记10 分离出红色
- iOS类别(Category)与扩展(Extension)
- 阿里weex研究iOS(二)已有项目集成
- IOS Dev Intro - NSString
- iOS开发之异常收集机制
- iOS导航栏NavigationBar的颜色,按钮和标题以及字体颜色
- IOS Dev Intro - NSInteger
- iOS开发:创建真机调试证书步骤(还有一篇是真机测试步骤)(2015年)