11-new方法实现原理、构造方法、类工厂方法

2016-04-12  本文已影响121人  Giurlo

new方法实现原理


Person *p = [Person new];//创建一个Person对象p
Person *p1 = [Person alloc];
Person *p2 =  [p1 init];
// 创建一个对象都使用 alloc init, 这样可以统一编码格式
Person *p3 = [[Person alloc] init];

构造方法基本概念


Person.h代码示例如下

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end

Person.m代码示例如下

#import "Person.h"

@implementation Person

- (instancetype)init
{
    // 注意: 不要把 = 号写为 ==
    // 一定要将[super init]的返回值赋值给self
    if (self = [super init]) {
        // 初始化子类
        _age = 6;
    }
    return self;
}
@end

自定义构造方法


Person.h代码示例如下

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;
@property NSString *name;

- (instancetype)initWithAge:(int)age andName:(NSString *)name;
@end

Person.m代码示例如下

#import "Person.h"

@implementation Person

- (instancetype)initWithAge:(int)age andName:(NSString *)name
{
    if (self = [super init]) {
        _age = age;
        _name = name;
    }
    return self;
}
@end

Student.h代码示例如下

#import "Person.h"

@interface Student : Person

@property int no; // 学号

- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no;
@end

Student.m代码示例如下

#import "Student.h"

@implementation Student

- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no
{
    if (self = [super initWithAge:age andName:name]) {
        _no = no;
    }
    return self;
}
@end

类工厂方法


Person.h代码示例如下

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;

+ (instancetype)person;

+ (instancetype)personWithAge:(int)age;
@end

Person.m代码示例如下

#import "Person.h"

@implementation Person

+ (instancetype)person
{
    return [[self alloc] init];
    // 自定义类工厂方法, 在类工厂方法中创建对象一定要使用self来创建
    // self在类方法中就代表类对象
    // 谁调用当前方法, self就代表谁
}

+ (instancetype)personWithAge:(int)age
{
    Person *p = [[self alloc] init];
    p.age = age;
    return p;
}
@end
上一篇下一篇

猜你喜欢

热点阅读