Objective-c官方文档 怎么自定义类

简介: 通过类别来给已经存在的类添加方法来实现自定义类 如果你需要添加一个方法给一个已经存在的类,也许能增加新的功能使你更容易来在我们的应用里处理一些事情。最简单的方法是用类别。 这个语法有点想类的接口描述但是他是没有继承类的,相反的要指定类别的名字在括号里面。

 

通过类别来给已经存在的类添加方法来实现自定义类
如果你需要添加一个方法给一个已经存在的类,也许能增加新的功能使你更容易来在我们的应用里处理一些事情。最简单的方法是用类别。
这个语法有点想类的接口描述但是他是没有继承类的,相反的要指定类别的名字在括号里面。
@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就是通过继承而不是通过以上两种方式来解决,因为还要导入头文件什么的。
相关文章
|
iOS开发
Objective-c官方文档 封装数据属性
版权声明:原创作品,谢绝转载!否则将追究法律责任。   很多对象需要跟踪信息为了执行他们的任务。一些对象设计模型一个或者多个值。例如NSNumber 类用来保存一个值或者自定义的类有一些属性。有一些对象不在一般的范围内。
965 0
|
测试技术 iOS开发
Objective-c官方文档 怎么使用对象
版权声明:原创作品,谢绝转载!否则将追究法律责任。   对象发送和接受消息 尽管有不同的方法来发送消息在对象之间,到目前位置是想中括号那样[obj doSomeThing];左边是接受消息的接收器,右边是接收器调用的方法,换句话说obj发送doSomeThing消息。
915 0
|
存储 C语言 iOS开发
Objective-C官方文档 值和集合
版权声明:原创作品,谢绝转载!否则将追究法律责任。 尽管Objective-c是一个面向对象的语言,是C语言的超集,这意味着你可以用任何标准的C标量(非对象)像int,float,和char在Objective-c里面。
933 0
|
iOS开发
Objective-C官方文档 协议
版权声明:原创作品,谢绝转载!否则将追究法律责任。   在现实生活中,当处理某一情况的时候人们往往遵循严格的程序。执法人员他们在打官司的收集证据和询问的时候一定要遵守协议。 在面向对象的语言中,最重要的是一个对象需要定义一些行为在某种情况下。
1013 0
|
6月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
380 2
|
4月前
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
iOS Objective-C 应用连接Azure Storage时,若不关闭账号的匿名访问,程序能正常运行。但关闭匿名访问后,上传到容器时会出现错误:“Public access is not permitted”。解决方法是将创建容器时的公共访问类型从`AZSContainerPublicAccessTypeContainer`改为`AZSContainerPublicAccessTypeOff`,以确保通过授权请求访问。
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
|
6月前
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
94 2
|
6月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
261 0
|
iOS开发 容器
iOS 代码规范格式 Objective-C(上)
iOS 代码规范格式 Objective-C
429 0
iOS 代码规范格式 Objective-C(上)
|
编译器 API iOS开发
iOS 代码规范格式 Objective-C(下)
iOS 代码规范格式 Objective-C(下)
235 0