Cocoa 框架为什么采用两阶段的方式来创建对象?
对于之前一直使用C#语言的我来说,刚开始接触Objective-c来创建对象时很迷惑,为何创建对象一般情况下需要通过发送两个消息(调用两个方法)才能创建一个类实例对象(例如[[UIButton alloc] init])?相信使用Java的也会有这样的感受,给个类型调用一下初始化方法不就完了吗?真是麻烦!虽然Objective-c中也有采用new一步到位的(例如:[UIButton new]),但是这种用法貌似不是很常见。水果公司这么做肯定是有道理的。下面我们先讨论一下采用直接创建的方式有何利弊。
上文提到,我们可以通过[UIButton new]的方式创建一个对象,实质上这个消息内部调用的也是[[UIButton alloc] init]。说明通过new方式创建的对象都是采用默认的alloc方式从堆中分配内存。这么做从结果上来讲,当然是可以正确的创建出一个对象的,但是同样这也扼杀了c语言中其它的分配内存的方式。试想一下这种情况,假定能够以进程间共享特殊内存或者映射到计算机虚拟地址空间的内存来存储图片,而不是以默认的方式在内存中进行分配,那么上面那种方式就不够合适。或许你会说,我可以新建下面两个方法:
+ (instancetype)imageWithVirtualMemory:(VirtualMemory *)memory;
+ (instancetype)imageWithSharedMemory:(SharedMemory *)memory;
当然代码中的VirtuaMemory和SharedMemory是虚拟的两个类。我们可以不用太过关注。
这么做似乎解决了问题,但是这仅仅是分配方式的两种变化,init方法也可以有多种变化,假如一个类现在有5种alloc方式,以及8种init方式。如果合并在一个方法中创建对象的话,这就意味着我们需要创建5*8=40种创建对象的方式。介绍到这里,我相信我们已经有了一个理由让我们采用两阶段创建的方式。
Cocoa 框架为什么采用两阶段的方式来创建对象?的更多相关文章
- fine-tuning 两阶段模型
目前大部分的nlp任务采用两阶段的模型,第一阶段进行预训练,一般是训练一个语言模型.最出名的是BERT,BERT的预训练阶段包括两个任务,一个是Masked Language Model,还有一个是N ...
- mysql的两阶段协议(封锁定理,虫洞事务)
我们都知道数据库的事务具有ACID的四个属性:原子性,一致性,隔离性和持久性.然后在多线程操作的情况下,如果不能保证事务的隔离性,就会造成数据的修改丢失(事务2覆盖了事务1的修改结果).读到脏数据(事 ...
- 设备程序远程升级采用两种方式(优先采用IP方式)
设备程序远程升级采用两种方式(优先采用IP方式): 采用应急广播TS流传输技术规范的消息内容表携带升级包数据.当辅助数据类型值为44时,消息内容表传输的数据为程序升级包. 采用IP方式传输升级包数据. ...
- 分布式事务专题笔记(二)分布式事务解决方案之 2PC(两阶段提交)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 前面已经了解了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC ...
- 深度学习与CV教程(12) | 目标检测 (两阶段,R-CNN系列)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- struts2+spring的两种整合方式
也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...
- cocoa框架 for iOS
1.Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境. 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言:也不是开发工具,你可 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
上一篇<更加简练的编程体验>提供了最新版本的Dora.Interception代码的AOP编程体验,接下来我们会这AOP框架的编程模式进行详细介绍,本篇文章着重关注的是拦截器的定义.采用“ ...
- Cocoa 框架 For iOS(一) 框架的介绍,Objectivie-C运行时能力的解析等 (转载)
http://blog.csdn.net/totogo2010/article/details/8081253 Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助. ...
随机推荐
- MPAndroidChart 的实现
效果图: 代码实现: package com.jiahao.me; import java.util.ArrayList; import java.util.List; import android. ...
- VC++ 网络编程总结(一)
1.套接字编程原理 一个完整的网间通信进程需要由两个进程组成,并且只能用同一种高层协议.也就是说,不可能通信的一段用TCP,而另一端用UDP.一个完整的网络信息需要一个五元组来标识:协 ...
- C++ AfxBeginThread
计算从1+2+3...+100000=? 关键点 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, in ...
- delphi 插入 HTML代码 播放器
Delphi在Webbrowser中插入 HTML/java script代码 使用方法将下面的代码赋值到1个记事本里保存,然后保存为xxx.htm就可以看到效果使用PasteHtml实现功能 的事件 ...
- target=_parent与target=_top的区别与用途
转自:http://www.taoshaw.com/taoshaw/article.asp?id=1868 在手动改HTML代码时经常会用到target参数,常用的有两个target=_blank 和 ...
- Swift 3.0 的 open,public,internal,fileprivate,private 关键字
import Foundation /// final的含义保持不变 public final class FinalClass { } // 这个类在ModuleA的范围外是不能被继承的 ...
- phonegap 安装和使用eclipse
1.下载nodejs...然后注销让nodejs可用 2.下载jdk,ant.和安卓的sdk. jdk是为ant编译时需要,设置JAVA_HOME环境变量 C:\Program Files\Java\ ...
- android140 360 黑名单 启动service和分页加载
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- Apache 学习笔记(心得)
http://blog.csdn.net/btbtd/article/details/288027#2 # 分类:# 01.常规设置# 02.虚拟主机# 03.<Directory> + ...
- Internet连接共享访问,依赖服务或组无法启动
问题与现象 在启用本地Internet连接共享给VMware的虚拟网卡时,出现了如下错误提示,导致无法启用(如图一示): Internet连接共享访问被启用时,出现了一个错误.依赖服务或组无法启动 图 ...