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