什么是類工廠方法:
用于快速創(chuàng)建對象的類方法, 我們稱之為類工廠方法
類工廠方法中主要用于 給對象分配存儲空間和初始化這塊存儲空間
規(guī)范:
1.一定是類方法 +
2.方法名稱以類的名稱開頭, 首字母小寫
3.一定有返回值, 返回值是id/instancetype
蘋果的一個規(guī)范(重要)
自定義類工廠方法是蘋果的一個規(guī)范, 一般情況下, 我們會給一個類提供自定義構造方法和自定義類工廠方法用于創(chuàng)建一個對象
// [[NSString alloc] init]; //構造方法創(chuàng)建字符串對象
// [NSString string]; //相對應的類工廠方法創(chuàng)建字符串對象
// [[NSString alloc] initWithString:<#(NSString *)#>];//構造方法創(chuàng)建字符串對象
// [NSString stringWithString:<#(NSString *)#>];//相對應的類工廠方法創(chuàng)建字符串對象
// [[NSArray alloc] init];//構造方法創(chuàng)建數組對象
// [NSArray array];//相對應的類工廠方法創(chuàng)建數組對象
// [NSArray alloc] initWithObjects:<#(id), ...#>, nil//構造方法創(chuàng)建數組對象
// [NSArray arrayWithObjects:<#(id), ...#>, nil]//相對應的類工廠方法創(chuàng)建數組對象
類工廠方法在繼承中的注意點(重要):
// 注意: 以后但凡自定義類工廠方法, 在類工廠方法中創(chuàng)建對象一定不要使用類名來創(chuàng)建
// 一定要使用self來創(chuàng)建
// self在類方法中就代表類對象, 到底代表哪一個類對象呢?
// 誰調用當前方法, self就代表誰
Person.m
#import "Person.h"
@implementation Person
+ (instancetype)person
{
// return [[Person alloc] init];
// 注意: 以后但凡自定義類工廠方法, 在類工廠方法中創(chuàng)建對象一定不要使用類名來創(chuàng)建
// 一定要使用self來創(chuàng)建
// self在類方法中就代表類對象, 到底代表哪一個類對象呢?
// 誰調用當前方法, self就代表誰
return [[self alloc] init];
}
+ (instancetype)personWithAge:(int)age
{
// Person *p = [[Person alloc] init];
Person *p = [[self alloc] init];
p.age = age;
return p;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
/*
Student *stu = [Student person]; // [[Person alloc] init];
(如果Person的類工廠方法沒有用self后面給no賦值就會報錯,因為no是Student的特有屬性。)
Person *p = [Person person];
// stu.age = 55;
// NSLog(@"age = %i", stu.age);
stu.no = 888;
NSLog(@"no = %i", stu.no);
*/
(如果Person的類工廠方法沒有用self后面給no賦值就會報錯,因為no是Student的特有屬性。)
Student *stu = [Student personWithAge:30];
Person *p = [Person personWithAge:30];
stu.no = 888;
return 0;
}