开发时,通用功能为了以后的方便使用,通常将其封装起来放到公司的私有库当中,有些封装就需要一些必传的值,但是当别人用你的东西的时候他可能会忽略一些参数在调试的时候,那么这个时候这个东西就非常的有用.
我就举一个简单的例子:
首先创建一个模型 HJModel
在.h中
#import <Foundation/Foundation.h>
@interface HJModel : NSObject
- (void)test;
@end
在.m中
#import "HJModel.h"
@implementation HJModel
- (void)test{
NSLog(@"---%@",[self key]);
}
- (NSString *)key
{
#ifdef DEBUG
NSAssert(nil, @"弄一个子类, 重新返回key");
#endif
return @"";
}
@end
然后创建一个子类
#import "HJSonModel.h"
@implementation HJSonModel
- (NSString *)key
{
return @"我设置了一个key";
}
@end
在外面调用
#import "ViewController.h"
#import "HJModel.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
HJModel *model = [[HJModel alloc] init];
[model test];
}
@end
这个时候运行你会发现:闪退了,为什么?因为这个时候你要用子类来调用了
- (void)viewDidLoad {
[super viewDidLoad];
HJSonModel *model = [[HJSonModel alloc] init];
[model test];
}
这个时候你在运行会发现:
在父类中的这个self 是子类 HJSonModel
这个时候你将子类中的
- (NSString *)key
{
return @"我设置了一个key";
}
这几行代码注销掉会发生闪退,和上面的闪退是一个reason:
但是这个时候这个self又是父类HJModel了,这就是消息的传递,运行时它在子类中没有找到这个方法,就会到父类中找,除非你直接用super.
这个东西在封装中比较有用,当然了这个NSAssert也有其他不少的用法,我就不一一叙述了.
第一次写简书,还有些小紧张,JJ都出汗了,肯定会有很多遗漏,大神请忽略我这个菜鸟写的屌丝东西,希望谅解.