對象是類Class運(yùn)行時(shí)的實(shí)例,它包含了自己的實(shí)例變量(屬性中聲明)的內(nèi)存副本以及類方法的指針,在實(shí)際開發(fā)中可以采用內(nèi)存地址分配以及初始化兩個(gè)步驟來創(chuàng)建一個(gè)對象。
對象的創(chuàng)建分為兩個(gè)階段:內(nèi)存空間分配和初始化。初始化總是緊跟在內(nèi)存空間分配之后進(jìn)行的,但是在創(chuàng)建對象的過程中,這兩個(gè)操作的作用是不同的。
1、分配內(nèi)存空間alloc
在為一個(gè)對象分配內(nèi)存空間時(shí),需要調(diào)用alloc(或者allocWithZone:)方法。
除了為對象在程序的內(nèi)存區(qū)劃定一塊合適大小的內(nèi)存空間之外,alloc方法還有如下的幾個(gè)重要作用:
將對象的retain count設(shè)置為1;
使初始化對象的isa實(shí)例變量指向?qū)ο蟮念悾渲?,對象類是一個(gè)根據(jù)類定義編譯得到的運(yùn)行對象。另外,每一個(gè)對象都有一個(gè)isa變量標(biāo)示它是哪個(gè)類的實(shí)例;
將其他類中定義的實(shí)例變量的值初始化為0或者nil。
2、初始化init
初始化的過程將對象的實(shí)例變量設(shè)置為合理且有用的初始值,還可以分配和準(zhǔn)備對象需要的其他全局資源,并在必要時(shí)裝在諸如文件這樣的資源。
初始化方法一般都以init開頭,可以設(shè)置多個(gè)初始化的方法,例如, NSString類,提供了如下初始化方法:
-(instancetype)init NS_DESIGNATED_INITIALIZER;
-(nullable instancetype)initWithCoder:(NSCoder*)aDecoder NS_DESIGNATED_INITIALIZER;
-(instancetype)initWithCharacters:(constunichar*)characters length:(NSUInteger)length;
-(nullable instancetype)initWithUTF8String:(constchar*)nullTerminatedCString;
-(instancetype)initWithString:(NSString*)aString;
-(instancetype)initWithFormat:(NSString*)format,...NS_FORMAT_FUNCTION(1,2);
-(instancetype)initWithFormat:(NSString*)format locale:(nullable id)locale,...NS_FORMAT_FUNCTION(1,3);
-(instancetype)initWithFormat:(NSString*)format locale:(nullable id)locale arguments:(va_list)argList NS_FORMAT_FUNCTION(1,0);
-(nullable instancetype)initWithData:(NSData*)data encoding:(NSStringEncoding)encoding;
-(nullable instancetype)initWithBytes:(constvoid*)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;
以init方法為例,在對象調(diào)用init方法時(shí),主要完成了如下的工作:
調(diào)用父類的初始化方法[super init];
如果父類返回的對象不為空,則可以對對象進(jìn)行進(jìn)一步的設(shè)置;例如,在一個(gè)自定義UIView類中,可以設(shè)置該類的backgroundColor屬性;
如果父類返回的對象為nil,則直接返回nil。
-(instancetype)init
{
self=[superinit];
if(self){
//添加自定義聲明
}
returnself;
}
3、類方法
類方法是方法前面為+號的方法,類方法把創(chuàng)建對象過程的兩個(gè)步驟(內(nèi)存空間分配+初始化)合并,直接返回被創(chuàng)建的對象。在實(shí)際開發(fā)過程中,類方法的使用非常普遍,例如,NSString類也提供了如下一些類方法:
+(instancetype)string;
+(instancetype)stringWithString:(NSString*)string;
+(instancetype)stringWithCharacters:(constunichar*)characters length:(NSUInteger)length;
+(nullable instancetype)stringWithUTF8String:(constchar*)nullTerminatedCString;
+(instancetype)stringWithFormat:(NSString*)format,...NS_FORMAT_FUNCTION(1,2);
+(instancetype)localizedStringWithFormat:(NSString*)format,...NS_FORMAT_FUNCTION(1,2);
示例代碼:分別使用類方法和普通方法創(chuàng)建對象
intmain(intargc,constchar*argv[]){
@autoreleasepool{
//使用類方法創(chuàng)建字符串對象
NSString*str=[NSStringstringWithFormat:@"www.hcios.com"];
//使用alloc + init方法創(chuàng)建字符串對象
NSString*str2=[[NSStringalloc]initWithString:@"宏創(chuàng)學(xué)院"];
NSLog(@"%@, %@",str,str2);
}
return0;
}