一、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. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  2. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  3. 前端框架 EasyUI (1)熟悉一下EasyUI

    jQuery EasyUI 官方网站 http://www.jeasyui.com/ .去年新开了个中文网 http://www.jeasyui.net/,不知道是不是官方的,不过看着挺像样.但是,广 ...

  4. JavaScript中Math对象的方法介绍

    1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...

  5. MongoDB系列(一):简介及安装

    什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为应用提供可扩展的高 ...

  6. Spring aop应用之实现数据库读写分离

    Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...

  7. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  8. 浅谈单片机中C语言与汇编语言的转换

    做了一单片机设计,要用C语言与汇编语言同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议. 单片机设计:基于51单片机的99码表设计 软件环境:Proteus8 ...

  9. Quartz

    Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度. eg: ja ...

  10. BRDF 光照模型

    http://blog.csdn.net/liu_lin_xm/article/details/4846144