使用NSObject类的alloc方法可以为对象分配内存,将对象的实例变量初始化为0。但是alloc方法既没有将该对象的实例变量初始化为合适的值,也没有为这个对象准备其他必须的对象和资源。
NSObject提供了init方法可以完成对象初始化的基础任务。
通常使用一行代码就可以分配和初始化实例:[[ClassName alloc]init];
重构
真特么的高大上的名字。官方解释:在不更改外部行为的情况下重新构建现有的代码。麻痹的不就是修改部分功能吗。
工厂方法
工厂方法是指用于创建和初始化类的便捷方法,他们是类方法。
eg:
- (id)initWithName:(NSString *)name;
+ (id)PeopleWithName:(NSString *)name;
@implementation
+ (id)PeopleWithName:(NSString *)name {
return [[[self class] alloc] init];
}
@end
创建工厂方法的名称与初始化方法的名称类似,但是它含有类名前缀。
消息转发
相关方法:
forwardingTargetForSelector: (快速转发)
&
forwardInvocation:(标准转发)
如果你拥有一个定义了对象能够消化哪些消息的目标类,快速转发可以取得很好的效果。否则你就应该使用标准转发。
快速转发eg:
@interface Two : NSObject
- (void)youCanNotDo;
@end
@implementation Two
- (void)youCanNotDo {
NSLog(@"你做不到");
}
@end
@interface One : NSObject
- (void)youCanNotDo;//最好是给NSObject写一个含有该方法的分类,然后引用
@property(nonatomic)Two two;
@end
@implementation One
- (void)viewDidLoad {
[super viewDidLoad];
_two = [[Two alloc]init];
[self youCanNotDo];//会报错
}
- (id)forwardingTargetForSelector:aSel {
if(_two respondsToSelector:aSel) {//判断目标类是否能够处理
return _two;
}
return nil;
}
@end
分类在Objective-C File文件里。