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

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

    显示路径: cd ~ defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE killall Finder 不显示路径: ...

  2. e559. 创建窗口

    A frame is a component container that displays its contents in a top-level window with a title bar a ...

  3. JavaBean递归拷贝工具类Dozer

    JavaBean深度拷贝利器——Dozer DozerBeanMapper对象之间相同属性名赋值 DozerBeanMapper + 对象转Map方法 Dozer(JavaBean的映射工具)开发手册

  4. 使用appledoc 生成技术API文档具体解释

    一. 首先安装 appledoc 第一步:使用终端命令进行下载安装 git clone git://github.com/tomaz/appledoc.git cd ./appledoc sudo s ...

  5. 数据源(HikariCP)

    HikariCP 是一个高性能的 JDBC 连接池组件.下图是性能的比较测试结果: 自从看到了这张图,我就对于我之前一直在使用了 c3p0 产生了深深的怀疑,迫切的期望得到对应的数据来优化我的代码. ...

  6. C# POST数据base64到接口会出错的问题

    这个base64在requestHeader里面变成了base64=hySGNg22yX0AIjNQvNJw0xHEbi32NH%2BiRVKDkbOmUiKpxW0%2FS6rUgfLmSa527Y ...

  7. 管道符和作业控制 shell变量 环境变量配置文件

    8.6 管道符和作业控制 8.7/8.8 shell变量 8.9 环境变量配置文件 管道符和作业控制 管道符:表示把一个文件的输出内容传送到后面的命令 grep  用来过滤指定关键词的命令 “|” 为 ...

  8. POI初体验

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 它的结构如下: HSSF - 提供读写Micros ...

  9. 【Postgresql】set up

    https://www.howtoforge.com/tutorial/ubuntu-postgresql-installation/ https://linux.cn/article-6770-1. ...

  10. 代码记录——phase16,block36

    36*36 -2,-2扩展 代码有问题,有时能运行有时报错. HRESULT RotateZoom(PBYTE pbSrc,int iWidth,int iHeight,double dbRotate ...