一、NS_DESIGNATED_INITIALIZER

  用来修饰init方法,被修饰的方法称为designated initializer;没有被这个修饰的init方法称为convenience initializer

  参考1对之的说明为

1.A designated initializer must call (via super) a designated initializer of the superclass. Where NSObject is the superclass this is just [super init].
2.Any convenience initializer must call another initializer in the class - which eventually leads to a designated initializer.
3.A class with designated initializers must implement all of the designated initializers of the superclass.

  解释下就是

1.designated initializer 必须调用父类的designated initializer (最终指向也会有警告)
2.convenience initializer最终必须指向一个designated initializer
3.有designated initializer的类必须实现父类的designated initializer方法 

  补充点

  1.继承性,当子类里面没有其他的init方法时,继承父类的designated initializer;如果子类有其他的init方法,则父类的 designated initializer 方法 都变成了  convenience initializer

  2.NSCoding 的 initWithCoder: 是一个 designated initializer方法

  3.参考2最后提出了一个疑问

@interface A : NSObject

- (instancetype)initDesignated NS_DESIGNATED_INITIALIZER;
- (instancetype)initUndesignated; @end @implementation A - (instancetype)init
{
return ([self initUndesignated]);
} - (instancetype)initDesignated
{
return (self = [super init]);
}
- (instancetype)initUndesignated
{
return (self = [self initDesignated]);
} @end @interface B : A - (instancetype)initDesignatedB NS_DESIGNATED_INITIALIZER;
- (instancetype)initUndesignatedB; @end @implementation B - (instancetype)initDesignated
{
return [self initUndesignatedB];
} - (instancetype)initDesignatedB
{
return (self = [super initDesignated]);
} - (instancetype)initUndesignatedB
{
return ([self initDesignated]);
} @end 

  参考2疑问为什么 最后一个函数 initUndesignatedB 里面这样调用不会有警告,其实很好理解。

    1.因为self没有实现initUndesignated,所以会调用 super 的 initUndesignated方法

    2.super 的 initUndesignated 需要调用 initDesignated 方法

    3.子类实现了 initDesignated 方法,所以最终回调用到 self 的 initDesignated 方法

  这当然不会有什么问题了

二、NS_UNAVAILABLE

  用来修饰所有的方法,表示这个类的这个方法是不可用的。

   一个很好的用法就是配合上面的 NS_DESIGNATED_INITIALIZER 修饰符。因为父类的 designated initializer 必须在子类实现,而如果子类只希望有另一种 designated initializer 存在,就可以把父类的 designated initializer 申明为 NS_UNAVAILABLE,这样就不用去实现,也避免出现多个init 方法。

三、NS_REQUIRES_SUPER

  用来修饰所有方法,表示子类override父类的方法时,必须在方法内部调用super的这个方法。

  如果子类真的不想去调用 super 用 NS_REQUIRES_SUPER 修饰的方法,又不想出现警告,那么可以用下面的方式处理

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
方法实现
#pragma clang diagnostic pop

四、无修饰

如果是init方法,那么这个init方法就是 convenience initializer。

参考:

1.http://useyourloaf.com/blog/xcode-6-objective-c-modernization/

2.https://yq.aliyun.com/articles/5847

3.http://blog.jobbole.com/65762/

iOS 方法修饰符的更多相关文章

  1. java中的类修饰符、成员变量修饰符、方法修饰符。

    类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fin ...

  2. Java进阶(四十)Java类、变量、方法修饰符讲解

    Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...

  3. Java 类、属性、方法修饰符 public、private、protected、default

    Java 中修饰类修饰符:public .default (默认) Java 中修饰类中属性.方法修饰符:public.private.protected.default (默认) 通过 IDEA 创 ...

  4. .NET C#基础(2):方法修饰符 - 给方法叠buff

    0. 文章目的   本文面向有一定.NET C#基础知识的学习者,介绍C#中的方法修饰符的含义和使用以及注意事项.   1. 阅读基础   理解C#基本语法(如方法声明)   理解OOP基本概念(如多 ...

  5. iOS 属性修饰符记录 --不定时更新

    重新审视了一下OC在属性修饰符,特意记录一下来.以后不定时更新 > retain:只有在非ARC下才会有效,所有如果在ARC下使用了retain修饰也白搭 如以下的data属性用retain修饰 ...

  6. java中的方法重载与重写以及方法修饰符

    1. 方法重载Overloading , 是在一个类中,有多个方法,这些方法的名字相同,但是具有不同的参数列表,和返回值 重载的时候,方法名要一样,但是参数类型和参数个数不一样,返回值类型可以相同,也 ...

  7. java中的类修饰符、成员变量修饰符、方法修饰符

    类修饰符:  public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fi ...

  8. 分部类,分部方法 - 修饰符partial

    一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多个源文件中,每个源文件只包含类型定义的一部分. 当使用自动生成的源时,无须重新创建源文件便可将代码添加到类中.Visual Stu ...

  9. 实现继承+接口继承+虚方法+隐藏方法+this/base+抽象类+密封类/方法+修饰符

    概念: 在上一节课中学习了如何定义类,用类当做模板来声明我们的数据. 很多类中有相似的数据,比如在一个游戏中,有Boss类,小怪类Enemy,这些类他们有很多相同的属性,也有不同的,这个时候我们可以使 ...

随机推荐

  1. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  2. 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

    一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...

  3. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  4. 如何快速优化手游性能问题?从UGUI优化说起

    WeTest 导读   本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法.   在之前的文 ...

  5. 来吧,HTML5之一些注意事项

    1.说什么是HTML HTML是一种超文本标记语言(Hyper Text Markup Language), 标记语言是一套标记标签(markup tag),用来描述网页的非编程语言. 2.标签特性: ...

  6. [systemtap手记]debian体系安装过程

    Debian体系,本人测试用机 Ubuntu 11.10 uname -r 查看原本的内核版本为 3.0.0-12-generic 第一步: 安装systemtap包 $ sudo apt-get i ...

  7. 我大中华微软MVP中国区人才库

    刘海峰:国内知名微软开源技术网站51Aspx 创始人,十年以上的Asp.net从业经验,微软MSDN特约讲师.Teched讲师.ImagineCup大赛评委.人大出版社研修班特约讲师,曾多次受邀访问美 ...

  8. 15个C++项目列表

    实验楼上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点. 如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的! 如果你不知 ...

  9. [Django]用户权限学习系列之Permission权限基本操作指令

    若需建立py文件进行测试,则在文件开始加入以下代码即可 #coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODU ...

  10. System进程(pid=4)占用80端口的解决方案

    问题 Mail服务器在安装TFS服务(含SQLServer2016)后启动不了网页服务. 排查问题 使用命令查看端口占用情况 netstat -nao | find ":80" n ...