概述
最近再看关于iOS的基础知识,突然发现经常用到的一些技术的有些模糊,所以在这里做下总结,方便以后查阅.
一. Category - 类目
Category 是比继承更为简洁的方法来对Class进行扩展,无需创建子类就可以为现有的类动态添加方法,可以是项目内任何已经存在的类,甚至那些没有源代码的类.(看不到.m 文件的类)
- 类目的声明及实
// 声明
@interface NSString (CjString)
- (NSString *) cj_AppendingLength;
@end
// 实现
@interface NSString (CjString)
- (NSString *)cj_AppendingLength{
NSString *result = @"";
if (self) {
result = [NSString stringWithFormat:@"%@ length is %ld", self, [self length]];
}
return result;
}
@end
- 调用/结果
注意
- 类目声明的方法优先级高于原始类的方法,所以在命名类目的方法的名时,苹果官方建议在方法名的开头加上一个前缀.防止在命名时与原始类的方法名发生冲突
二. Extension - 延展
延展可以理解成是匿名的Category,可以用来给当前来添加属性和新方法,不作用在Subclass.只能对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework class,是不可以的.
- 延展
@interface Person ()
// 有没有好眼熟
// 一般用来给类添加私有属性跟方法
// 在Xcode升级之后,延展很少用,因为在implementatio的方法跟变量默认就是私有的
// 在Xcode之前版本因为我们在C语言中在方法实现之前去调用的话,就必须要在之前声明一下
@end
三. Protocol - 协议
协议 是对外声明的一个方法列表,这些方法有必须去实现 也有可选去实现的.(@required必须实现,@optional可选实现) 对外提供的接口.
委托 (传值) 协议也可以把自己想要做的事情委托给被人去处理,这样的方式可以实现传值的效果.
这里简单演示下委托(传值)
- 代码:
协议:
@protocol TestDelegate <NSObject>
@required
- (void)sendReuiedValue:(NSString *)value;
@optional
- (void)sendOptionalValue:(NSString *)value;
@end
@interface NextVC : UIViewController
@property (nonatomic, weak) id delegate;
@end
委托人:
#import "NextVC.h"
- (IBAction)BackAction:(id)sender {
if (_rTextField.text != nil) {
[_delegate sendReuiedValue:_rTextField.text];
}
if (_oTextField.text != nil) {
[_delegate sendOptionalValue:_oTextField.text];
}
[self dismissViewControllerAnimated:YES completion:^{
}];
}
实现者:
#import "ViewController.h"
#import "NextVC.h"
@interface ViewController ()<TestDelegate>
@property (weak, nonatomic) IBOutlet UILabel *nLabel;
@property (weak, nonatomic) IBOutlet UILabel *oLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)goToVC:(id)sender {
NextVC *nextVC = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"NextVC"];
// 指定代理人
[nextVC setDelegate:self];
[self presentViewController:nextVC animated:YES completion:^{
}];
}
// 必须实现的方法
- (void)sendReuiedValue:(NSString *)value{
if (value != nil) {
[_nLabel setText:value];
}
}
// 可选实现的方法
- (void)sendOptionalValue:(NSString *)value{
if (value != nil) {
[_oLabel setText:value];
}
}
总结
Category (分类) 可以将可以复用的方法进行整理, 可以将某个类进行解耦,使其不至于太过臃肿.Protocol(协议) 可以声明一些公用的方法,这样在项目里面查看起来就会比较正规,整洁.具体就看大家的习惯了.