Classes / Constructors

@interface Man : NSObject
@property (nonatomicNSString *name;
@property (nonatomicNSString *country;
- (instancetype)initWithName:
    (NSString *)name
    country:(NSString *)country;
- (instancetype)initWithName:
    (NSString *)name;
@end

@implementation Man

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

//no default values: shorter inits
//substitute them
- (instancetype)initWithName:
    (NSString *)name {
    return [self initWithName:name
        country:@"unknown"];
}

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

Man *man1 = [Man new];
//name 'unknown', country 'unknown'

Man *man2 = [[Man alloc]
    initWithName:@"Vladimir"];
//name 'Vladimir', country 'unknown'

Man *man4 = [[Man alloc]
    initWithName:@"Vladimir"
    country:@"Russia"];
//name 'Vladimir', country 'Russia'