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

如果你需要添加一个方法给一个已经存在的类,也许能增加新的功能使你更容易来在我们的应用里处理一些事情。最简单的方法是用类别。
这个语法有点想类的接口描述但是他是没有继承类的,相反的要指定类别的名字在括号里面。
@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. e781. 设置JList中的选择模式

    // The default mode is MULTIPLE_INTERVAL_SELECTION String[] items = {"A", "B", & ...

  2. C#数据结构----------------------------哈希表源码解析

    转载: C# Hashtable源码剖析 源代码版本为 .NET Framework 4.6.1 本系列持续更新,敬请关注 有投入,有产出. Hashtable实现一个哈希表(也叫散列表),将键映射到 ...

  3. (转)【多媒体封装格式详解】--- AAC ADTS格式分析

     出自:http://blog.csdn.net/tx3344/article/details/7414543 http://www.it6655.com/2012/08/aac-adts-html ...

  4. Radix-64编码简介

    本文介绍Radix-64编码,PGP和S/MIME均使用了Radix-64编码技术,rfc4880的Chap 6有关于Radix-64的详细描述. Radix-64编码基于Base64编码技术,由两部 ...

  5. ViewBag和ViewDate以及TempDate的区别

    简单的说,就是   ViewBag 和  ViewData 是数据共享的(他们都是共享 ViewData 的数据),ViewBag 实际就是对 ViewData的一个操作的封装.  区别 : View ...

  6. Spring简单集成Redis

  7. 架构师素养及从小菜进阶架构(CTO)的书籍【转】

    CTO要了解无线技术/搜索/大数据/数据库等. -- 通常定义架构有几个层次,这包括业务架构.产品架构.应用架构和技术架构: 1.业务架构:描述一个企业围绕一个行业做了哪些业务,例如支付行业的收单.退 ...

  8. Easyradius 1.699更新,增加用户设备绑定、桥接用户管理功能

    最近几天,由于IDC机房设备的问题,导致OA连接3天一天挂2次,真是把我抑闷着,最事一个烦事特别多 好不容易等了一个五一假期,也不得空,把最近一些网友反馈的OA的一些功能及BUG进行修复,主要是以下几 ...

  9. nginx搭建(centos7)

    1.安装前准备: 系统: CentOS 7.5 x64 下载包:wget yum -y install wget 安装: 2.安装一下这些依赖条件: yum install gcc pcre pcre ...

  10. [SQLite3]connection string的连接池参数引发的错误

    最近在.net中使用Sqlite数据库,发现.net的驱动做得不错,而且实现了加密功能.于是想给自己的数据库加上口令,结果,多次实验都以失败告终: 链接数据库,然后ChangePassword都成功执 ...