您好,欢迎访问代码之道!登录后台查看权限
  • 欢迎大神光临
  • 有朋自远方来 不亦悦乎

Objective-C教程之类的便利初始化和工厂方法

ObjC教程 老刘 2018-08-15 715 次浏览 0个评论

当我给Colleague实现一个MSPerson类的时候,Colleague很希望这个类用[[MSPerson alloc]init]创建 一个对象的时候,就已经帮她将name属性默认设置为"访客"。这个要求很简单,我们重写一下init方法就可以了。

- (instancetype)init {
    self = [super init];
    if (self) {
        _name = @"访客";
    }
    return self;
}

第二天,Colleague很希望创建一个对象的时候,直接传一个名字进去,将name属性初始化了,因为她真的很不想每次创建 对象后多写一行去设置name属性。

这就要用到便利初始化方法了,名字很高大上,但是其实只是要求定义一个方法以init开头并带上附加参数就可以了,当然 因为这不是重写了,所以我们还要将这个方法放到接口声明中。

- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
    }
    return self;
}

有了上面这个方法,init的方法其实可以简化了

- (instancetype)init {
    return [self initWithName:@"访客"];
}

调用:

MSPerson *aPerson = [[MSPerson alloc]initWithName:@"jack"];

第三天,Colleague希望创建一个对象并初始化name属性的同时,不需要[MSPerson alloc],因为她真的不想多打两个单词。 这...本想删库走人!但是再想想我不入地狱谁入地狱,于是默默的地写个类工程方法,所谓类工程方法其实就是一个类方法可以同时完成[[MSPerson alloc]init...]两步的类方法,方法命名以类名(不包括类前缀)为方法前缀。工厂在面向对象编程中特指构造类对象的工具。

为MSPerson添加创建一个对象并初始化name属性的工厂方法

+ (instancetype)personWithName:name {
    return [[MSPerson alloc] initWithName:name];
}

调用

MSPerson *aPerson = [MSPerson personWithName"jack"];

附件完整代码:

// MSPerson.h
#import <Foundation/Foundation.h>

@interface MSPerson : NSObject

@property(nonatomic, copy) NSString *name;

- (instancetype)initWithName:(NSString *)name;
+ (instancetype)personWithName:name;

@end

// MSPerson.m
#import "MSPerson.h"

@implementation MSPerson

- (instancetype)init {
    return [self initWithName:@"访客"];
}

- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
    }
    return self;
}

+ (instancetype)personWithName:name {
    return [[MSPerson alloc] initWithName:name];
}

@end

// main.h
#import "MSPerson.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MSPerson *p1 = [MSPerson new];
        p1.name = @"jack";
        MSPerson *p2 = [[MSPerson alloc] initWithName:@"jack"];
        MSPerson *p3 = [MSPerson personWithName:@"jack"];
        NSLog(@"p1 %@", p1.name);
        NSLog(@"p2 %@", p2.name);
        NSLog(@"p3 %@", p3.name);
    }
    return 0;
}

已有 715 位网友参与,快来吐槽:

发表评论