new方法實(shí)現(xiàn)原理
Person *p = [Person new];//創(chuàng)建一個(gè)Person對(duì)象p
-
new做了三件事情- 1.開辟存儲(chǔ)空間 + alloc 方法
- 2.初始化所有的屬性(成員變量) - init 方法
- 3.返回對(duì)象的地址
Person *p1 = [Person alloc];
-
alloc- 1.開辟存儲(chǔ)空間
- 2.將所有的屬性設(shè)置為0 (對(duì)象類型值為null)
- 3.返回當(dāng)前實(shí)例對(duì)象的地址
Person *p2 = [p1 init];
-
init- 1.初始化成員變量, 但是默認(rèn)情況下init的實(shí)現(xiàn)是什么都沒有做
- 2.返回初始化后的實(shí)例對(duì)象地址
- 注意: alloc返回的地址, 和init返回的地址是同一個(gè)地址
// 創(chuàng)建一個(gè)對(duì)象都使用 alloc init, 這樣可以統(tǒng)一編碼格式
Person *p3 = [[Person alloc] init];
構(gòu)造方法基本概念
-
概念: 在OC中
init開頭的方法, 稱之為構(gòu)造方法 - 構(gòu)造方法的用途: 用于初始化一個(gè)對(duì)象, 讓某個(gè)對(duì)象一創(chuàng)建出來就擁有某些屬性和值
-
重寫
init方法: 在init方法中初始化成員變量 -
格式注意:
- 1.必須先初始化父類, 再初始化子類
- 2.必須判斷父類是否初始化成功, 只有父類初始化成功才能繼續(xù)初始化子類
- 3.返回當(dāng)前對(duì)象的地址
Person.h代碼示例如下
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end
Person.m代碼示例如下
#import "Person.h"
@implementation Person
- (instancetype)init
{
// 注意: 不要把 = 號(hào)寫為 ==
// 一定要將[super init]的返回值賦值給self
if (self = [super init]) {
// 初始化子類
_age = 6;
}
return self;
}
@end
自定義構(gòu)造方法
-
其實(shí)就是自定義一個(gè)init方法
- 1.一定是對(duì)象方法
- 2.一定返回
id/instancetype - 3.方法名稱一定以init開頭
一個(gè)類可以有0個(gè)或者多個(gè)自定義構(gòu)造方法
自定義構(gòu)造方法可以有1個(gè)或多個(gè)參數(shù)
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
-
自定義構(gòu)造方法在繼承中的表現(xiàn)
Student類繼承自Person類
Student.h代碼示例如下
#import "Person.h"
@interface Student : Person
@property int no; // 學(xué)號(hào)
- (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
類工廠方法
- 類工廠方法: 用于快速創(chuàng)建對(duì)象的類方法, 稱之為類工廠方法
- 作用: 類工廠方法中主要用于 給對(duì)象分配存儲(chǔ)空間和初始化這塊存儲(chǔ)空間
-
規(guī)范:
- 1.一定是類方法 +
- 2.方法名稱以類的名稱開頭, 首字母小寫
- 3.一定有返回值, 返回值是
id/instancetype
- 注意: 自定義類工廠方法是蘋果的一個(gè)規(guī)范, 一般情況下, 要給一個(gè)類提供自定義構(gòu)造方法和自定義類工廠方法用于創(chuàng)建一個(gè)對(duì)象
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];
// 自定義類工廠方法, 在類工廠方法中創(chuàng)建對(duì)象一定要使用self來創(chuàng)建
// self在類方法中就代表類對(duì)象
// 誰調(diào)用當(dāng)前方法, self就代表誰
}
+ (instancetype)personWithAge:(int)age
{
Person *p = [[self alloc] init];
p.age = age;
return p;
}
@end
- 補(bǔ)充注意: 自定義類工廠方法, 在類工廠方法中創(chuàng)建對(duì)象一定要使用self來創(chuàng)建, self在類方法中就代表類對(duì)象, 誰調(diào)用當(dāng)前方法, self就代表誰
- 類工廠方法在繼承中的注意點(diǎn): 子類擁有父類的方法,可再定義自己的成員變量。