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
相关推荐
解决Anolis(龙蜥),解决System.TypeInitializationException: The type initializer for ‘Gdip’ threw an exception.
根据给定的文件信息,以下是对“iOS 2018面试题”中涉及的知识点进行的详细解析: ### 技术基础知识 1. **Objective-C为何被称为动态语言:** - Objective-C作为一门面向对象的编程语言,其动态特性主要体现在...
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
6. 类和对象:Swift支持面向对象编程,包括类(class)、继承、初始化器(initializer)和属性(property)。 7. 协议与扩展:协议定义了一组要求,而扩展(extension)则允许为现有的类型添加功能,无需修改原始...
然而,由于AVR-GCC的轻量级特性,它可能不直接支持某些C++11及更高版本的高级特性,如lambda表达式和`std::initializer_list`。 Lambda表达式是C++11引入的一个强大特性,它允许我们在代码中定义匿名函数,常用于...
initializer-list分析
在iOS开发中,异步状态机是一种常用的编程模式,它用于管理对象或系统在不同状态之间的转换,并且这些转换可以在不同的线程上下文...这样的设计在iOS应用开发中非常常见,特别是在需要处理大量异步操作和回调的情况下。
从压缩包子文件的文件名称列表 "dodoo-initializer-0.5.1" 来看,解压后应该会得到一个名为 "dodoo-initializer-0.5.1" 的目录,其中包含了该库的源代码、元数据文件(如setup.py和MANIFEST.in)、测试代码、文档...
在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法) 会自动对参数对象加锁,保证临界区内的代码线程安全 @synchronized(self) { // 这段...
无论是`init`、`initWith`还是`Designated`和`Convenience Initializer`,选择合适的创建姿势可以优化代码结构,提高代码质量,并确保数据安全。在实际开发中,应根据项目的具体需求来决定使用哪种创建对象的方式。
Based on the provided information from "iOS 5 Programming Cookbook" by Vandad Nahavandipoor, we can derive a comprehensive set of knowledge points related to iOS development using Objective-C....
invalid initializer(解决方案).md
总的来说,Spring Boot Initializer是Spring Boot项目初始化的关键组件,它帮助我们构建和配置应用上下文。通过ApplicationContextInitializer,我们可以深入定制Spring容器的行为,满足各种复杂的应用场景需求。而`...
- **Init方法**:设计清晰的初始化流程,区分指定初始化器(designated initializer)和辅助初始化器(secondary initializer)。 - **Init error**:初始化失败时,通过`NSError`返回错误信息,避免隐含的失败状态...
《Python库lztools.initializer-1.0.12-py3.7.egg详解》 在Python的世界里,库是开发者的重要工具,它们提供了丰富的功能,帮助我们更高效地编写代码。今天我们要讨论的“lztools.initializer-1.0.12-py3.7.egg”...
CreateInstanceFromType is not allowed to be called from a ScriptableObject constructor (or instance field initializer), call it in OnEnable instead. Called from ScriptableObject '...
`iter_iter_initializer_list.pass.c` 文件名暗示了它可能是一个关于迭代器和初始化列表的C++测试用例。在C++中,迭代器是一种指向容器内元素的对象,而初始化列表则用于构造对象时提供初始值。这部分代码可能涉及...
Spring Initializer(Spring 版 + Aliyun 版) JDK Require:JDK 17 启动命令:java -jar xxx.jar 1、Spring 版:官网 https://start.spring.io/ -> 本地 http://localhost:8080/ 2、Aliyun 版:官网 ...
在iOS开发领域,面试是检验开发者技能的关键环节。这篇简书文章分享了2017年5月作者在招聘iOS开发人员时的一些心得,...这些面试题目涵盖了iOS开发的核心知识,对于iOS开发者来说,理解并掌握这些概念和技术至关重要。