通过类别来给已经存在的类添加方法来实现自定义类

如果你需要添加一个方法给一个已经存在的类,也许能增加新的功能使你更容易来在我们的应用里处理一些事情。最简单的方法是用类别。
这个语法有点想类的接口描述但是他是没有继承类的,相反的要指定类别的名字在括号里面。
@interface ClassName (categoryName)
 
@end
一个类别可以被定义在任何的类里面。甚至你不知道他的实现比如Objective-c的一些已经存在的类。定义在你类别的方法对原始类有效的,对继承原始类也一样,。在运行时对于你是类别的方法和原始类的方法是没有区别的。
 
声明类别我们通常是声明一个单独的头文件和实现文件当用类别里的方法的时候导入他的头文件就行了。
 
类别可以被用来声明实例和类方法,但是不合适添加额外的属性,在类别添加属性是有效的,但是不能在类别添加额外的实例变量,这意味着编译器不能合成任何实例变量,不能合成属性访问器方法,你可以自己在实现文件里写访问器方法,但是不能跟踪属性的值除非他已经存在原始的类里面。
 
唯一的方法添加一个属性带有新的实例变量在一个已经存在的类用类的延展。
 
避免类别名字的冲突
因为添加类到已经知道的方法,所以应该小心给你的新建的类起名字。
如果这个方法定义在类目的名字和原始类的方法名字一样,或者同一个类的另一个类目的方法名字相同或者甚至父类。当某个方法在运行时实现的原因,这种行为未定义。如果给自己的类添加类别是没有这种可能的。但是向已经知道的类添加是有问题的。
 
举个例子你想服务器请求一个数据并且给返回的字符串进行编码,你给NSString添加一个类目来做这个事情,当你链接另一个框架的时候也有一个类目有同样的方法,那么哪个在运行时候会胜出,哪个显示未定义。
 
还有一个问题会出现当一个已经存在的类没有某种方法你加了一个类目提供这个方法实现,如果api更新了也存在这个方法,这时候意味着你的应用将可能出现冲突。
 
为了避免这个情况,最好添加方法的前缀就像自定义类那时候一样。
 
类的内部实现扩展延伸
类目和延展有点类似,但是你可以添加到类是有源代码的在编译时候,编译时候就像类目一样。定义语法:
@interface ClassName ()
@end
因为没有名字在括号里,所以经常延展被称为匿名类。
不想类目,延展是可以添加属性实例变量的。
@interface MyClass()
@property NSObject *obj;
@end
编译器会合成相关的访问器方法,以及一个实例变量在实现文件。如果你在延展里定义了一个方法你必须实现这个方法在实现文件里面。添加实例变量的实例:
@interface myClass ()
    id _someCustomInstanceVariable;
@end
 
使用延展来隐藏私人信息
公有类定义了方法是别的类可以和你进行交互。类的延展经常扩展类的公有接口用额外的私有方法和属性来给他们自己的类使用。例如你可以在接口声明一个只读的属性,但是你可以在实现文件声明一个可读写的属性,目的是使本来可以改变属性的值,而外部不能改变。
@interface person:NSObject
@property (readonly)NSString *uniqueIdentifier;
- (void)doSomeThing;
@end
 
这意味着uniqueIdentifier可以被另一个对象改变,如果确实有两个标识符怎么办呢用doSomeThing再新建一个。
为了使这个类自己能直接改变属性,我们在类的实现里面定义延展。如下:
@interface MyCalss ()
@property (readwrite) NSString *uniqueIdentifier;
@end
@implementation MyClass 
@end
 
 
这意味着编译器能合成访问器方法,因此延展的私有方法能改变这个属性值。
 
别的类访问这个方法会编译错误的。
 
考虑其他的方法定制类:
考虑可重用行比如我创建 一个自定义的button就是通过继承而不是通过以上两种方式来解决,因为还要导入头文件什么的。

Objective-c官方文档 怎么自定义类的更多相关文章

  1. 【翻译】Emmet(Zen Coding)官方文档 之六 自定义 Emmet

    [说明]本系列博文是依据 Emmet 官方文档翻译的,原文地址为:http://docs.emmet.io/,部分内容已经在博主之前的博文中节选过,为方便已经收藏过之前博文的朋友,没有删除这些博文,仅 ...

  2. NHibernate官方文档中文版——持久化类(Persistent Classes)

    持久化类是一个应用程序中的类,主要用来实现业务逻辑(例如,在电商应用中的客户和订单类).持久化类,就像它的名字一样,生命周期短暂并且用来持久化的据库对象实例. 如果这些类的构造能够依照一些简单的原则, ...

  3. clang format 官方文档自定义参数介绍(中英文)

    官方文档:http://clang.llvm.org/docs/ClangFormatStyleOptions.html 中文 在代码中配置样式 当使用 clang::format::reformat ...

  4. python附录-builtins.py模块str类源码(含str官方文档链接)

    python附录-builtins.py模块str类源码 str官方文档链接:https://docs.python.org/3/library/stdtypes.html#text-sequence ...

  5. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  6. 【AutoMapper官方文档】DTO与Domin Model相互转换(中)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  7. 【AutoMapper官方文档】DTO与Domin Model相互转换(下)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  8. Hui之Hui.js 官方文档

    基础 // 判断值是否是指定数据类型 var result = hui.isTargetType("百签软件", "string"); //=>true ...

  9. Spark官方文档 - 中文翻译

    Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...

随机推荐

  1. EF + MySql 错误:配置错误 无法识别的元素“providers”

    “/”应用程序中的服务器错误. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的元素“providers” ...

  2. 架构 : 三层架构、MVC、MVP、MVVM

    1. 三层架构   将整个业务应用划分为:界面层(User Interface layer, UIL).业务逻辑层(Business Logic Layer, BLL).数据访问层(Data acce ...

  3. unity-----------------------使用BuildAssetBundle打包

      我发现很多美工兄弟都爱问程序Unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作而引起的. 1.不保存就在上传 这个操作太恐怖了,切记!!在 U3D里 ...

  4. 逻辑卷管理LVM 扩容LV容量实例(一)

    实验环境: 一台Linux 服务器添加两块硬盘,一块硬盘容量30G,另一块硬盘容量50G,采用VMware Workstation虚拟机进行模拟实验. 30G硬盘先分成一个分区,分区大小为25G,再创 ...

  5. EXP 导出出错解决方案

    前言: 今天想要把 当前用户下的数据库 导出来,使用命令 导出数据库可用语句: exp bpmp/bkc123@127.0.0.1:5050/bkcyunty file=D:\bak\db_61.dm ...

  6. 各大引擎矩阵的矩阵存储方式 ----行矩阵 or 列矩阵

    OpenGL  里面的矩阵 float  m[16]; OpenGL中的矩阵是这样的 m[0] m[4] m[8] m[12] m[1] m[5] m[9] m[13] m[2] m[6] m[10] ...

  7. 环境变量PATH/cp命令/mv命令/文档查看cat/more/less/head/tail

    2.10 环境变量PATH 2.11 cp命令 2.12 mv命令 2.13 文档查看cat/more/less/head/tail which  rmdir 可以查到命令的路径 例如: ls 命令是 ...

  8. 有关maven不能加载ojdbc14.jar解决方法

    首先下载ojdbc14-10.2.0.4.0.jar这个包,然后在cmd下输入以下 mvn install:install-file -DgroupId=com.oracle -DartifactId ...

  9. unity之UGUI屏幕分辨率調整

    1.Canvas的屬性配置: 2.Canvas Scaler的屬性配置: 3.根據不同的屏幕比例動態寫改碩放基準: public float standard_width = 800f; //初始宽度 ...

  10. MongoDB中常用的find

    接着前一篇文章,下面主要介绍一下MongoDB中常用的find操作. 先打开MongoDB shell,通过下面一组命令插入一些数据. post1 = {} post2 = {} post3 = {} ...