iOS Dev (48) initializer 和 convenience constructor
- 作者:大锐哥
- 博客:http://prevention.iteye.com
initializer
这个你应该很熟悉。
- (id)initWithSomething;
convenience constructor
但是在实际运用中,我们经常用的写法是:
[[Foo alloc] init];
如果把这货定义成一个方法,如下:
+ (id)buildInstance;
除了写着简单,还有啥区别?
initializer 会被编译器自动地写成:
- (instancetype)initWithSomething;
convenience constructor 则不会被编译器优化。所以可能会遇到问题,比如下面:
Foo.h
#import <Foundation/Foundation.h>
@interface Foo : NSObject
+ (id)buildInstance;
- (id)init;
@end
Foo.m
#import "Foo.h"
@implementation Foo
+ (id)buildInstance
{
return [[self alloc] init];
}
- (id)init
{
return [super init];
}
@end
这时候你调用:
[[Foo buildInstance] doSomethingElse];
[[[Foo alloc] init] doSomethingElse];
第一句不会报错,第二句会报错。而如果你改一下:
+ (instancetype)buildInstance
这两句都会报错。为什么?
因为第一句在 buildInstance 返回值为 id 的情况下,编译器是不会知道该把返回值当成谁,也无法找到 doSomethingElse 这个方法。
init 被编译器当作返回 instancetype,convenience constructor 不会
当然还有很多其他的好处,以后慢慢体会吧。
转载请注明来自大锐哥的博客:http://prevention.iteye.com
相关推荐
dry-initializer, 使用参数和选项构建类初始值设定项的DSL 干初始值设定项 使用参数和选项构建类初始值设定项的DSL 。安装将此行添加到你的应用程序的Gemfile中:gem 'dry-initializer'然后执行:$ bundle
内网中连接不上https://start.spring.io,搭建\https://start.spring.io一样的服务器。 initializr-service-0.7.0.BUILD-SNAPSHOT.jar
initializer-list分析
资源中包含两个文件,将其拷贝到AVR-GCC系统include文件目录下,就可以在代码中支持initializer_list和lambda表达式
在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法) 会自动对参数对象加锁,保证临界区内的代码线程安全 @synchronized(self) { // 这段...
Spring Initializer(Spring 版 + Aliyun 版) JDK Require:JDK 17 启动命令:java -jar xxx.jar 1、Spring 版:官网 https://start.spring.io/ -> 本地 http://localhost:8080/ 2、Aliyun 版:官网 ...
由于https://start.spring.io/ 网站访问不稳定或者超时现象,本次搭建0.12.0 最新 版本 ,springboot 达到 2.7.0 相关组件最新 启动方法 java -jar initializr-service-custom-2.6.3.jar 已经打包的jar无须下载源码...
Laravel Initializer使您能够声明这些进程并通过简单的app:install和app:update artisan命令运行它们,这些命令根据当前环境运行预定义的操作链。 此外, app:update命令还可以简化Forge,Envoy.blade.php,...
资源来自pypi官网。 资源全名:dodoo-initializer-0.5.1.tar.gz
python库,解压后可用。 资源全名:lztools.initializer-1.0.12-py3.7.egg
解决Anolis(龙蜥),解决System.TypeInitializationException: The type initializer for ‘Gdip’ threw an exception.
资源来自pypi官网。 资源全名:lztools.initializer-1.0.12-py3.7.egg
Spring 是一个扩展性很强的容器框架,为开发者提供了丰富的扩展入口,其中一个扩展点便是 ApplicationContextInitializer (应用上下文初始化器 )。
概述有时需要在加载应用之前运行代码,有时希望暂停应用初始化,直到完成某些限制之后再执行。APP_INITIALIZER是一个函数,在应用改程序初始化时被调用。可
Teronis.ModuleInitializer [。[..]] :warning: 我不能再推荐这种方法了。 相反,我强烈建议在C#9中使用新的模块初始化程序功能。 旁注:这些项目是一部分,但已被外包,因为它们参与了Azure DevOps的Windows ...
js-project-initializer 初始化nodejs项目或前端项目的工具。安装yarn global add js-project-initializer 用法运行js-project-initialize选项钥匙描述-h,-帮助打印此消息。 -v,-版本打印版本特征 UI组件 Js图书馆...
资源分类:Python库 所属语言:Python 资源全名:lztools.initializer-1.0.4-py3.7.egg 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
router-initializer构建的同构聊天应用程序入门运行应用程序分叉并克隆 Repo npm install gulp start 在浏览器中导航到localhost:8000应用详情这是一个同构的聊天应用程序,使用react-router用于服务器和客户端路由...
Define the initializer, create data fields, and define methods. 3. Use a constructor 4. The name of the initializer is __init__. 5. The self refers to the object itself. Through self, the members of ...
适用于Dry :: Initializer的YARD插件 [dry-initializer]宝石很棒。 它使定义类的依赖关系变得如此方便和声明。 但是,当您使用这些类时,如何知道它期望哪个位置参数,以什么顺序和哪个关键字呢? 查看源代码很...