重要经验五: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 //只能修饰 ...
随机推荐
- HTML学习笔记 CSS背景样式案例 第六节 (原创) 参考使用表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Problem F: 分数类的类型转换
Description 封装一个分数类Fract,用来处理分数功能和运算,支持以下操作: 1. 构造:传入两个参数n和m,表示n/m:分数在构造时立即转化成最简分数. 2. show()函数:分数 ...
- Asp.Net Core API网关Ocelot
首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具 ...
- php 例子 如何转换ISO8601为 utc时间
//firstpowertime "2017-01-02T13:22:22" 获取时间$firstpowertime=$list[$i]['firstpowertime'];//判 ...
- SQL server中事务的四个属性特征(ACID)
事务的概念.类型和四个特征(ACID). 1.事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Se ...
- Mac上配置不同版本的JDK
Mac上JDK的版本为1.8,编译AOSP时发现需要JDK 1.7.想找一种比较容易切换JDK版本的方式,经过一番Google发现Jenv比较合适. 安装Jenv至少有三种方式: - $ git cl ...
- 前端框架:react还是vue?
之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...
- 用python画一朵玫瑰花
废话不多说,直接上代码 from turtle import * import time setup(600,800,0,0) speed(0) penup() seth(90) fd(340) se ...
- 容易被忽视的后端服务 chunked 性能问题
容易被忽视的后端服务 chunked 性能问题 标签(空格分隔): springboot springmvc chunked 背景 spring boot 创建的默认 spring mvc 项目 集成 ...
- C++对象模型之lambda表达式
lambda表达式的求值-对象构造 本来想写“定义”,即“definition”,像函数定义一样,函数具体实现的代码实体即为实现,但是就像lambda既然被称为表达式,它确实有表达式那样“求值”的动作 ...