分类
作用
1、声明私有方法
2、分解体积庞大的类文件
3、还可以添加实例方法,类方法,协议,属性(添加getter和setter方法,并没有实例变量,添加实例变量需要用关联对象)
特点
为系统类添加方法
- 分类能添加成员变量吗?
不能。只能通过关联对象(objc_setAssociatedObject)来模拟实现成员变量 - 如果工程里有两个分类A和B,两个分类中有一个同名的方法,哪个方法最终生效?
取决于分类的编译顺序,最后编译的那个分类的同名方法最终生效(因为在动态添加类的方法的时候是倒序遍历方法列表的,最后编译的分类的方法会放在方法列表前面,访问的时候就会先被访问到)
扩展(Extension)
Extension:扩展, 匿名分类;放在.m文件中
声明私有属性; (不对子类暴露)
声明私有方法;
声明私有成员变量;
只有.h文件
UIView+ExtensionView.h
ProtocolFile.h
协议
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol ProtocolFile <NSObject>
-(void)ProtocolFile;
@end
扩展
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIView ()
-(void)test;
@property (nonatomic, copy) NSString *colorStr;
+(void)testAdd;
@end
NS_ASSUME_NONNULL_END
控制器调用
#import "ViewController.h"
#import "UIView+ExtensionView.h"
#import "ProtocolFile.h"
@interface ViewController ()
@property (nonatomic, strong) UIView *stringView;
@property (nonatomic, weak) id <ProtocolFile>delagte;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.stringView test];
[UIView testAdd];
self.stringView.colorStr = @"hah";
[self.delagte ProtocolFile];
}
所以扩展只以声明方式存在,调用是写在.m中的,所以都是私有的。
平时开发中其实用的最多。写在.m中的方法和属性,只有本类能用
分类(Category)和扩展(Extension)区别?
协议 (protocol)
代理(delegate)要用weak,防止循环引用。
代理用weak不用assign原因:
- assign:
assign 指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能会产生野指针,delegate指向的对象销毁之后,delegate中依然会保存之前对象的地址,delegate就成了野指针。 - weak:
eak 指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁是由外部控制的,当delegate指向的对象销毁之后,delegate = nil。
网友评论