重要经验五:block作为属性的注意事项
现代ios应用的开发。不使用GCD和block,效率会减少非常多,在今年3月份之前,我在block的学习和使用方面,精力和经验都明显不足,在SF有个牛逼同事。不仅自己积累了一套库,并且对这个库持续进行更新和维护,其架构能力和代码水平都不错,他的代码中使用了大量的GCD,为了适应这些技术。我在coding的过程中,開始有意识的多写GCD的代码,刚開始一切顺利。直到我使用block来作为一个对象的属性。这让我纠结了非常久。
我遇到的问题是:1。这样的属性block,其它类在使用的时候,应该怎么写? 2,block的类型不为void、int,而是对象时,比方NSString*时,又应该怎么办?
这两个非常easy的问题,让我前后一起纠结了2个多小时。以下,我把我的測试代码上上来。希望对遇到相同问题的人,有所帮助。以下直接上代码了。
头文件例如以下,实现文件里不须要实现不论什么代码。
#import <Foundation/Foundation.h>
typedef
int(^compareBlock)(int a,
int b);
@interface HBTestBlock :
NSObject
@property(nonatomic,
copy) compareBlock compare;
@property(nonatomic,
copy) UIView *(^viewGetter)(NSString *imageName);
//注意其返回类型为UIView *
@end
以下这两个函数,展示的是怎样在其它的类中,使用这两个属性。
#pragma mark 測试对象的属性为block
- (void)testObjPropertyBlock
{
HBTestBlock *objPropertyBlockObj = [[HBTestBlock
alloc] init];
objPropertyBlockObj.viewGetter = ^(NSString *imageName){
// return [[UIView alloc] init]; //特别注意此处。若对象不匹配,则会报错,设置为nil也会报错。
return [self
currentView];
};
objPropertyBlockObj.viewGetter(@"hello");
//实际运行block
}
- (UIView *)currentView
{
NSLog(@"now I am in currentView");
return
nil;
}
- (void)testPropertyBlock
{
HBTestBlock *properBlockObj = [[HBTestBlock
alloc] init];
properBlockObj.compare = ^(int a,int b)
{
int result = [self
maxer:a another:b];
NSLog(@"the result is %d",result);
return result;
};
));
}
- (int)maxer:(int)a another:(int)b
{
if (a > b) {
return a;
}
return b;
}
重要经验五:block作为属性的注意事项的更多相关文章
- Vuex的五个核心属性
Vuex的五个核心属性 Vuex的五个核心概念 本文参考自Vue文档,说的非常详细,建议看文档. Vuex是什么? VueX 是一个专门为 Vue.js 应用设计的状态管理架构,统一管理和维护各个vu ...
- 【NX二次开发】Block UI 属性类型
Block UI 属性类型的读写总结: 帮助文件 NXOpen::BlockStyler::UIBlock::GetProperties() String类型 //设置值 this->块ID- ...
- 【HighCharts系列教程】五、版权属性——Credits
一.Credits属性说明 严格来讲,Credits并不算版权信息,官方的说法是:Highchart by default putsa credits label in the lower right ...
- 四种传值方法(通知、block、属性、NSUserDefaults)
1. 通知传值-一般常用于返回界面的时候,把返回前界面的值传到返回后界面. //前一个界面 //注册通知 [[NSNotificationCenter defaultCenter] addObserv ...
- 一次 outline 去除经验(非继承属性,看着像继承)
情况描述: 目前维护的老项目是通过 easyui 生成的 html,嵌套结构非常多,当点击元素后,会有个边框???非常影响页面美观,这是啥迷惑点击交互??? 经验告诉我,这是 css 的 outlin ...
- JMeter学习(二十五)HTTP属性管理器HTTP Cookie Manager、HTTP Request Defaults
Test Plan的配置元件中有一些和HTTP属性相关的元件:HTTP Cache Manager.HTTP Authorization Manager.HTTP Cookie Manager.HTT ...
- web设计经验<五>国外设计师总结的7个找灵感实用方法
每个设计师不时会有创意灵感缺失.大脑一片空白的状态.盯着一个空白的屏幕,发愁着“好吧,我现在该做什么呢?该怎么做呢?”有些人喜欢静待,但这不是唯一的一个方法.焦虑的客户或者是你自己的不耐烦,都会让你无 ...
- (五)带属性值的ng-app指令,实现自己定义模块的自己主动载入
如今我们看下怎样使用带属性值的ng-app命令,让ng-app自己主动载入我们自己定义的模块作为根模块. <!DOCTYPE html> <html> <head> ...
- mysql学习(五)-字段属性
字段属性: unsigned: 无符号类型,只能修饰数值类型: create table if not exists t1(id int unsigned); zerofill:前端填0 //只能修饰 ...
随机推荐
- linux学习笔记二
进程(process)是程序实体运行的过程,是系统进行资源分配和调度的独立单位,或者说是一个程序在处理机上的一次执行活动. 区分一下进程和程序 1.0 程序是一个静态指令的集合:而进程是一个程序的动态 ...
- codefoces384A-Mafia心得
题目描述:One day n friends gathered together to play "Mafia". During each round of the game so ...
- RunLoop已入门?赶紧来应用一下
前言 对RunLoop还没有什么概念的同学请移步我的上一篇文章,传送门:RunLoop入门 看我就够了http://www.cnblogs.com/weiming4219/p/7879443.html ...
- VMWare安装Centos 6.9
VMWare下Centos 6.9安装教程,记录如下 1.新建虚拟机 (1)点击文件-->新建虚拟机 (2)选择 自定义(高级)-->下一步 (3)选择Workstation 12.0-- ...
- java对象拷贝和复制
参考文章:http://blog.csdn.net/XIAXIA__/article/details/41652057 解决问题:深拷贝.浅拷贝 和普通的对象赋值有什么区别? 对象复制 例如:Pers ...
- 重温CSS3
基础不牢,地动山摇!没办法,只能重温"经典"! 1.CSS3边框:border-radius; box-shadow; border-image border-radius:r1, ...
- python3学习笔记(0)
一.编程语言主要从以下几个角度分类:1.编译型和解释型2.静态语言和动态语言3.强类型定义语言和弱类型定义语言编译型:程序运行前先由负责翻译的程序将代码转换成可执行代码进行执行.例如C/C++.Pas ...
- python/numpy/tensorflow中,对矩阵行列操作,下标是怎么回事儿?
Python中的list/tuple,numpy中的ndarrray与tensorflow中的tensor. 用python中list/tuple理解,仅仅是从内存角度理解一个序列数据,而非数学中标量 ...
- LINQ学习系列-----2.1 一个Linq语句
Linq语句介绍 先上源码: 上述代码涵盖了Linq新特性: 代码解析: 针对本文中的几点特性,前面有文章进行阐述.
- 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件
关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1 本 ...