iOS 方法修饰符
一、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 方法修饰符的更多相关文章
- java中的类修饰符、成员变量修饰符、方法修饰符。
类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fin ...
- Java进阶(四十)Java类、变量、方法修饰符讲解
Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...
- Java 类、属性、方法修饰符 public、private、protected、default
Java 中修饰类修饰符:public .default (默认) Java 中修饰类中属性.方法修饰符:public.private.protected.default (默认) 通过 IDEA 创 ...
- .NET C#基础(2):方法修饰符 - 给方法叠buff
0. 文章目的 本文面向有一定.NET C#基础知识的学习者,介绍C#中的方法修饰符的含义和使用以及注意事项. 1. 阅读基础 理解C#基本语法(如方法声明) 理解OOP基本概念(如多 ...
- iOS 属性修饰符记录 --不定时更新
重新审视了一下OC在属性修饰符,特意记录一下来.以后不定时更新 > retain:只有在非ARC下才会有效,所有如果在ARC下使用了retain修饰也白搭 如以下的data属性用retain修饰 ...
- java中的方法重载与重写以及方法修饰符
1. 方法重载Overloading , 是在一个类中,有多个方法,这些方法的名字相同,但是具有不同的参数列表,和返回值 重载的时候,方法名要一样,但是参数类型和参数个数不一样,返回值类型可以相同,也 ...
- java中的类修饰符、成员变量修饰符、方法修饰符
类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fi ...
- 分部类,分部方法 - 修饰符partial
一.分部类 什么是部分类呢?简单来说就是将一个类型或方法拆分到两个或多个源文件中,每个源文件只包含类型定义的一部分. 当使用自动生成的源时,无须重新创建源文件便可将代码添加到类中.Visual Stu ...
- 实现继承+接口继承+虚方法+隐藏方法+this/base+抽象类+密封类/方法+修饰符
概念: 在上一节课中学习了如何定义类,用类当做模板来声明我们的数据. 很多类中有相似的数据,比如在一个游戏中,有Boss类,小怪类Enemy,这些类他们有很多相同的属性,也有不同的,这个时候我们可以使 ...
随机推荐
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- ASP.NET Core CORS 简单使用
CORS 全称"跨域资源共享"(Cross-origin resource sharing). 跨域就是不同域之间进行数据访问,比如 a.sample.com 访问 b.sampl ...
- 在vim中使用查找命令查找指定字符串
要自当前光标位置向上搜索,请使用以下命令: /pattern Enter 其中,pattern 表示要搜索的特定字符序列. 要自当前光标位置 ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- ASP.NET MVC——模型绑定
这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不 ...
- WPF中Grid实现网格,表格样式通用类
/// <summary> /// 给Grid添加边框线 /// </summary> /// <param name="grid"></ ...
- html中table边框属性
1.向右(横向)合并: <td colspan="5"><span>后台管理系统</span></td> 2.向下(纵向)合并: & ...
- ESLint的使用笔记
原文地址:https://csspod.com/getting-started-with-eslint/?utm_source=tuicool&utm_medium=referral 在团队协 ...
- Redis配置文件redis.conf
1.地址 2.Units单位 1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 2 对大小写不敏感 3.includes包含
- echo命令
linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的 ...