`
prevention
  • 浏览: 74057 次
社区版块
存档分类
最新评论

iOS Dev (48) initializer 和 convenience constructor

 
阅读更多

iOS Dev (48) initializer 和 convenience constructor

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

分享到:
评论

相关推荐

    libpng15,解决The type initializer for ‘Gdip’ threw an exception

    解决Anolis(龙蜥),解决System.TypeInitializationException: The type initializer for ‘Gdip’ threw an exception.

    iOS2018面试题

    根据给定的文件信息,以下是对“iOS 2018面试题”中涉及的知识点进行的详细解析: ### 技术基础知识 1. **Objective-C为何被称为动态语言:** - Objective-C作为一门面向对象的编程语言,其动态特性主要体现在...

    dry-initializer, 使用参数和选项构建类初始值设定项的DSL.zip

    dry-initializer, 使用参数和选项构建类初始值设定项的DSL 干初始值设定项 使用参数和选项构建类初始值设定项的DSL 。安装将此行添加到你的应用程序的Gemfile中:gem 'dry-initializer'然后执行:$ bundle

    Springboot Initializer

    内网中连接不上https://start.spring.io,搭建\https://start.spring.io一样的服务器。 initializr-service-0.7.0.BUILD-SNAPSHOT.jar

    Demo-iOS-Swift快速入门-2022年02月25日

    6. 类和对象:Swift支持面向对象编程,包括类(class)、继承、初始化器(initializer)和属性(property)。 7. 协议与扩展:协议定义了一组要求,而扩展(extension)则允许为现有的类型添加功能,无需修改原始...

    嵌入式avr编译器工具链GCC支持lambda和initializer-list<T>

    然而,由于AVR-GCC的轻量级特性,它可能不直接支持某些C++11及更高版本的高级特性,如lambda表达式和`std::initializer_list`。 Lambda表达式是C++11引入的一个强大特性,它允许我们在代码中定义匿名函数,常用于...

    initializer-list分析

    initializer-list分析

    IOS 使用的异步状态机

    在iOS开发中,异步状态机是一种常用的编程模式,它用于管理对象或系统在不同状态之间的转换,并且这些转换可以在不同的线程上下文...这样的设计在iOS应用开发中非常常见,特别是在需要处理大量异步操作和回调的情况下。

    PyPI 官网下载 | dodoo-initializer-0.5.1.tar.gz

    从压缩包子文件的文件名称列表 "dodoo-initializer-0.5.1" 来看,解压后应该会得到一个名为 "dodoo-initializer-0.5.1" 的目录,其中包含了该库的源代码、元数据文件(如setup.py和MANIFEST.in)、测试代码、文档...

    详解iOS 多线程 锁 互斥 同步

    在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法) 会自动对参数对象加锁,保证临界区内的代码线程安全 @synchronized(self) { // 这段...

    iOS创建对象的不同姿势详解

    无论是`init`、`initWith`还是`Designated`和`Convenience Initializer`,选择合适的创建姿势可以优化代码结构,提高代码质量,并确保数据安全。在实际开发中,应根据项目的具体需求来决定使用哪种创建对象的方式。

    IOS5 Programming Cookbook

    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

    invalid initializer(解决方案).md

    spring-boot-initializer

    总的来说,Spring Boot Initializer是Spring Boot项目初始化的关键组件,它帮助我们构建和配置应用上下文。通过ApplicationContextInitializer,我们可以深入定制Spring容器的行为,满足各种复杂的应用场景需求。而`...

    一份走心的iOS开发规范1

    - **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详解》 在Python的世界里,库是开发者的重要工具,它们提供了丰富的功能,帮助我们更高效地编写代码。今天我们要讨论的“lztools.initializer-1.0.12-py3.7.egg”...

    Unity - Behavior Designer Ver 1.5.7

    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.rar_The Program

    `iter_iter_initializer_list.pass.c` 文件名暗示了它可能是一个关于迭代器和初始化列表的C++测试用例。在C++中,迭代器是一种指向容器内元素的对象,而初始化列表则用于构造对象时提供初始值。这部分代码可能涉及...

    spring initializer(Spring 版 + Aliyun 版)

    Spring Initializer(Spring 版 + Aliyun 版) JDK Require:JDK 17 启动命令:java -jar xxx.jar 1、Spring 版:官网 https://start.spring.io/ -&gt; 本地 http://localhost:8080/ 2、Aliyun 版:官网 ...

    2017年5月iOS招人心得(附面试题) - 简书1

    在iOS开发领域,面试是检验开发者技能的关键环节。这篇简书文章分享了2017年5月作者在招聘iOS开发人员时的一些心得,...这些面试题目涵盖了iOS开发的核心知识,对于iOS开发者来说,理解并掌握这些概念和技术至关重要。

Global site tag (gtag.js) - Google Analytics