浅谈OC对象初始化的三种姿势
一、普通程序猿
普通程序员使用最常见路人姿势等场。普普通通,纯属陆仁辈。
陆仁贾写法:
// view 1 UIView *v1 = [UIView alloc] initWithFrame:CGRectMake(, , , )];
v1.backgroundColor = [UIColor whiteColor]; // view 2 UIView *v2 = [UIView alloc] initWithFrame:CGRectMake(, , , )];
v2.backgroundColor = [UIColor whiteColor]; // add to view
[self.view addSubview:v1];
[self.view addSubview:v2];
撸人已写法:撸人已明显比陆仁贾聪明多了。使用大括号隔离,view1与view2相互独立,创建代码变量不会相互污染。
// view 1
{
UIView *v1 = nil;
UIView *v = [UIView alloc] initWithFrame:CGRectMake(, , , )];
v.backgroundColor = [UIColor whiteColor]; v1 = v; [self.view addSubview:v1];
} // view 2
{
UIView *v2 = nil;
UIView *v = [UIView alloc] initWithFrame:CGRectMake(, , , )];
v.backgroundColor = [UIColor whiteColor]; v2 = v; [self.view addSubview:v2];
}
路人饼写法
// view 1
UIView *v1 = nil;
{
UIView *v = [UIView alloc] initWithFrame:CGRectMake(, , , )];
v.backgroundColor = [UIColor whiteColor];
v1 = v;
} // view 2
UIView *v2 = nil;
{
UIView *v = [UIView alloc] initWithFrame:CGRectMake(, , , )];
v.backgroundColor = [UIColor whiteColor];
v2 = v;
} [self.view addSubview:v1];
[self.view addSubview:v2];
二、文艺程序猿
文艺程序猿,使用教科书姿势登场。使用builder模式。使用block隔离初始化代码。
首先给NSObject增加扩展接口
// 扩展NSObject,增加Builder接口 @interface NSObject (Builder)
+ (id)z0_builder:(void(^)(id that))block;
- (id)z0_builder:(void(^)(id that))block;
@end
// 实现
@implementation NSObject (Builder) + (id)z0_builder:(void(^)(id))block {
id instance = [[self alloc] init];
block(instance);
return instance;
} - (id)z0_builder:(void(^)(id))block {
block(self);
return self;
} @end
使用。代码简洁工整。处处都是文艺范。
- (void) foo {
// 使用
// view 1
UIView *v1 = [UIView z0_builder:^(UIView *that) {
that.frame = CGRectMake(, , , );
that.background = [UIColor whiteColor];
}];
// view 2
UIView *v2 = [[UIView alloc] init];
[v2 z0_builder:^(UIView *that) {
that.frame = CGRectMake(, , , );
that.background = [UIColor whiteColor];
}];
// 添加到父视图
[self.view addSubview:v1];
[self.view addSubview:v2];
}
三、二逼程序猿
最后入场的是二逼程序猿。
!#!@#@%&……&%&#¥%!@#¥!@#¥!!!!! 这个是什么卵?
其实....我也不知道!>_<# 自行领悟。
黑科技?????呵呵~~ 我就是代码少,你吹啊~~
- (void) foo {
// view 1
UIView *v1 = ({
UIView *v = [UIView alloc] init];
v.frame = CGRectMake(, , , );
v.background = [UIColor whiteColor];
v;
});
// view2
UIView *v2 = ({
UIView *v = [UIView alloc] init];
v.frame = CGRectMake(, , , );
v.background = [UIColor blueColor];
v;
});
[self.view addSubview:v1];
[self.view addSubview:v2];
}
浅谈OC对象初始化的三种姿势的更多相关文章
- 浅谈Java对象回收的三种方式
半夜睡不着,加上最近在看Java虚拟机,写点给新手和自己看的东西. 第一类:生命周期中止 void scope(){ Test t = new Test(); } 第二类:对象无引用 (一).对象的应 ...
- 浅谈SQL Server中的三种物理连接操作
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
- 浅谈SQL Server中的三种物理连接操作(HASH JOIN MERGE JOIN NESTED LOOP)
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
- 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
- 浅谈Objective-C对象初始化的三类程序猿
序 早上看了位仁兄写了<Swift:让人眼前一亮的初始化方式>的文章.什么?!初始化?Objective-C!好吧,吓哔哔~~~ 一.普通程序猿 普通程序员使用最常见路人姿势等场.普普通通 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- js二维数组定义和初始化的三种方法总结
js二维数组定义和初始化的三种方法总结 方法一:直接定义并且初始化,这种遇到数量少的情况可以用var _TheArray = [["0-1","0-2"],[& ...
- Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...
- Kubernetes 对象管理的三种方式
Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...
随机推荐
- windo phone8.1 样式的基本使用(一)
样式的基本使用(一) 当一个项目中有多个控件出现相同的属性设置,那么可以使用以下解决办法 方法一: <Page.Resources> <!--向资源字典中添加一个键为Buttongr ...
- 51nod1085(01背包)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1085 题意: 中文题诶~ 思路: 01背包模板题. 用dp[ ...
- [C++][数据结构]队列(queue)的实现
对于队列的定义,前人之述备矣. 队列的实现方法与栈非常相似.我直接在我实现的那个栈的代码上加了一点东西,全局替换了一些标识符,就实现了这个队列. 我实现的是一个queue<value>容器 ...
- UWP crop image control
最近做项目,需求做一个剪切图片的东东.如下图 主要是在一个canvas上面.根据crop的大小画出半透明的效果 <Canvas x:Name="imageCanvas" Vi ...
- Redis学习笔记(3) Redis基础类型及命令之二
1. 集合类型 集合类型与列表类型有很多相似之处,但二者的区别在于:前者具有唯一性,但不具有有序性:后者具有有序性,但不具有唯一性.集合类型的常用操作是向集合中加入或删除元素.判断某个元素是否存在等, ...
- Spring-配置bean的方法(工厂方法和Factorybean)【转】
通过工厂方法配置bean 通过调用静态工厂方法创建bean 通过静态工厂方法创建bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节. 要声 ...
- Sharepoint页面项目展示画廊纯前端实现,后端用list/library简单维护
需求背景: Sharepoint页面项目展示画廊.图片+文字,要求图片与文字用Sharepoint Library维护,然后在sharepoint页面上被调用,生成项目展示画廊. 解决方案(纯前端), ...
- solr5.5 基于内置jetty配置 Ubuntu
下载地址:http://archive.apache.org/dist/lucene/solr/ 在你的目录下直接解压 tar -zxvf xxxxxx.tgz 现在就可以直接开启solr了bin/s ...
- Ext3文件系统mount选项和文件属性介绍
mount选项 设置方式 ext3 mount选项可以通过多个方式进行设置:1)内核编译时: 内核menuconfig通过CONFIG_EXT3_DEFAULTS_TO_ORDERED编译控制选项,来 ...
- dojo tree edit的使用[前端]
var store = new mydata.JsonRestStore({ target: "<%=ResolveUrl("~/uieditserver.ashx" ...