美文网首页
2018-03-15 category(类别) 继承 Exten

2018-03-15 category(类别) 继承 Exten

作者: 忙于未来的民工 | 来源:发表于2019-04-12 10:28 被阅读0次

1:category

category可以在运行时为现有的类添方法,不能添加属性和成员变量,但是利用运行时机制,可以为在类别中为类添加属性

类别中的方法和属性的优先级高于原有类的方法或者属性

1、引入运行时头文件。#import

2、在匿名分类或者头文件中添加属性。

区别是:匿名分类中添加的是私有属性,只在本类中可以使用,类的实例中不可以使用。头文件中添加的在类的实例中也可以使用。

//分类的头文件

@interfaceClassName(CategoryName)

//我要添加一个实例也可以访问的变量所以就写在这里了

@property(nonatomic,strong)NSString*str;@end

//匿名分类

@interfaceClassName()

@end

3、在实现里面写要添加属性的getter、setter方法

staticvoid*strKey = &strKey;

@implementationClassName(CategoryName)

-(void)setStr:(NSString*)str {

 objc_setAssociatedObject(self, &strKey, str, OBJC_ASSOCIATION_COPY); 

 }

 -(NSString*)str {

returnobjc_getAssociatedObject(self, &strKey);

 }

@end

在setStr:方法中使用了一个objc_setAssociatedObject的方法,这个方法有四个参数,分别是:

1.源对象,

2.关联时的用来标记是哪一个属性的key(因为你可能要添加很多属性),

3.关联的对象

4.一个关联策略。

//利用静态变量地址唯一不变的特性

1、staticvoid*strKey = &strKey;

2、staticNSString*strKey =@"strKey";

3、staticcharstrKey;

enum{ OBJC_ASSOCIATION_ASSIGN =0, //关联对象的属性是弱引用 

OBJC_ASSOCIATION_RETAIN_NONATOMIC =1,//关联对象的属性是强引用并且关联对象不使用原子性OBJC_ASSOCIATION_COPY_NONATOMIC =3,//关联对象的属性是copy并且关联对象不使用原子性

OBJC_ASSOCIATION_RETAIN =01401, //关联对象的属性是copy并且关联对象使用原子性

OBJC_ASSOCIATION_COPY =01403 //关联对象的属性是copy并且关联对象使用原子性};

2:继承

多个类具有相同的实例变量或者方法时,考虑使用继承

和category区别:

1:类别只可以添加方法,不可以添加属性,继承可以在父类原有的基础之上,添加属性和方法

2:类别不提倡对原有的方法进行重载,继承可以对原有的方法重载

3:类别可以被继承,在父类中添加的类别,子类也可以继承这个类别

共同点:都是对类的继承

3:扩展

扩展就是给类添加私有的方法和属性,添加的方法必须得实现,其实就是.m中的匿名类

相关文章

网友评论

      本文标题:2018-03-15 category(类别) 继承 Exten

      本文链接:https://www.haomeiwen.com/subject/voycqftx.html