- 自定义构造方法书写规范:
- 一定是对象方法,以减号开头
- 返回值一般是instancetype类型
- 方法名必须以initWith开头
- 继承中的自定义构造方法注意点
- 自己的事情自己做,父类的属性交给父类的方法来处理,子类的方法处理子类自己独有的属性
- 自定义类工厂方法的书写规范
- 一定是+号开头
- 返回值一般是instancetype类型
- 方法名称以类名开头,首字母小写
- 继承中的自定义类工厂方法注意点
- 父类中创建实例对象一定要使用self,不要使用自己的类名,因为self谁调用当前方法self就是谁
// 父类 Person , 子类 Student ,分别提供了自己对应的自定义构造方法与类工厂方法,通过不同的方式分别创建对象
//父类
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (assign,nonatomic)int age;
-(instancetype)initWithAge:(int)age;
+(instancetype)personWithAge:(int)age;
@end
#import "Person.h"
@implementation Person
-(instancetype)initWithAge:(int)age{
if (self = [super init]) {//固定格式
_age = age;
}
return self;
}
+(instancetype)personWithAge:(int)age{
//两种方式都可以
/*
这里一定要使用self、不要使用person 不然子类如果通过这种方式创建子类的实例对象,会得到person的实例对象, 子类指针指向父类的对象,很危险.
Person *p = [[self alloc]init];
p.age = age;
return p;
*/
//一定要使用self,不要使用person,如果子类通过这个方法创建实例对象,才能得到子类的实例对象的地址
return [[self alloc]initWithAge:age];
}
-(NSString *)description{
return [NSString stringWithFormat:@"age = %i",_age];
}
@end
//子类
#import "Person.h"
@interface Student : Person
@property (assign,nonatomic)int no;//学号
-(instancetype)initWithAge:(int)age andNo:(int)no;
+(instancetype)studentWithAge:(int)age andNo:(int)no;
@end
#import "Student.h"
@implementation Student
-(instancetype)initWithAge:(int)age andNo:(int)no{
//谁的事情谁来做,直接调用supper,age属于Person
//谁调用,就得到谁的实例对象地址
if (self = [super initWithAge:age]) {
_no = no;
}
return self;
}
+(instancetype)studentWithAge:(int)age andNo:(int)no{
/*
Student *s = [Student PersonWithAge:age];
s.no = no;
return s;
*/
return [[self alloc]initWithAge:age andNo:no];
}
-(NSString *)description{
return [NSString stringWithFormat:@"age = %i,no = %i",self.age,_no];
}
@end
//创建对象
//通过自定义构造方法创建Person的实例对象p1
Person *p1 = [[Person alloc]initWithAge:10];
NSLog(@"%@",p1);
//通过自定义类工厂方法创建Person的实例对象p1
Person *p2 = [Person personWithAge:20];
NSLog(@"%@",p2);
//通过自定义构造方法创建Student的实例对象s1
Student *s1 = [[Student alloc]initWithAge:10 andNo:123];
NSLog(@"%@",s1);
//通过自定义类工厂方法创建Student的实例对象s2
Student *s2 = [Student studentWithAge:20 andNo:456];
NSLog(@"%@",s2);
//通过父类的构造方法创建Student的实例对象s3
Student *s3 = [[Student alloc]initWithAge:30];
s3.no = 789;
NSLog(@"%@",s3);
//通过父类的类工厂方法创建Student的实例对象s4
Student *s4 = [Student personWithAge:40];
s4.no = 999;
NSLog(@"%@",s4);
//输出:
2018-11-06 10:17:28.104638+0800 构造方法与类工厂方法[1481:68391] age = 10
2018-11-06 10:17:28.104895+0800 构造方法与类工厂方法[1481:68391] age = 20
2018-11-06 10:17:28.104959+0800 构造方法与类工厂方法[1481:68391] age = 10,no = 123
2018-11-06 10:17:28.105007+0800 构造方法与类工厂方法[1481:68391] age = 20,no = 456
2018-11-06 10:17:28.105036+0800 构造方法与类工厂方法[1481:68391] age = 30,no = 789
2018-11-06 10:17:28.105069+0800 构造方法与类工厂方法[1481:68391] age = 40,no = 999
网友评论