爱博品牌软件的小编今天为大家来分享最新的一篇热点问题,这篇文章是一篇软件开发资讯,那么文中有哪些精彩的信息呢,让我们进入正文吧!
在iOS开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法。一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在iOS中还有更简单的方法,那就是Category.
用一个例子来简单介绍以下Category的用法。
1 @interface UIImageView (CategoryName)
只需要在interface中加上category的名称。
添加自定义的方法(Category)
我们来给UIImageView添加一个自定义的 speak 方法
1
2
3
4
5
@interface UIImageView (image)
- (void)speak:(NSString *)words;
@end
接下来就是对这个方法的实现
1
2
3
4
5
6
7
@implementation UIImageView (image)
- (void)speak:(NSString *)words
{
NSLog(@"%@",words);
}
@end
一旦实现了该方法,那么就可以在UIImageView中直接调用 speak 方法
添加自定义的属性(associative)
添加自定义属性需要用到 associative
1
2
3
4
5
@interface UIImageView (title)
@property (nonatomic, strong) NSString *title;
@end
但是仅仅这样是没有办法使用的,还需要导入包 #import
用到了OC的运行时
1
2
3
4
5
6
7
8
9
10
11
@implementation UIImageView (title)
static void * MyKey = (void *)@"MyKey";
- (NSString *)title
{
return objc_getAssociatedObject(self, MyKey);
}
- (void) setTitle:(NSString *)title
{
objc_setAssociatedObject(self, MyKey, title, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
然后实现该属性的get和set方法
Category的局限性
主要有两方面局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。可以通过associative来解决
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。这个类似于方法的重载,但是这里是直接覆盖了原方法
类别的作用
类别主要有3个作用:
(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(因为框架类没有源码,不能修改)。
(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告
(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。
associative
associative是在运行时动态的添加属性,一般用的比较少。但是还是需要熟悉一下。
爱博品牌软件技术人员团队规模:目前在职技术人员300余名,其中软件开发技术人员占比65%,测试人员占比25%,售后及运维人员占比的10%,人才供给充足,并且具备各类开发语言、项目模式的承接经验,在所覆盖的行业及应用中具备成熟的解决方案和实施交付能力。主营业务:计算机软件开发、技术转让、技术咨询、技术服务;计算机信息系统集成;货物进出口、技术进出口。