一、繼承 二、super self
三、初始化方法
四、指定初始化方法
五、便利構(gòu)造器
面向?qū)ο蟮娜筇匦?封裝,繼承:?向?qū)ο筇峁┝死^承特性,繼承既能保證類的完整,又能簡化代碼。多肽。。super是編譯器指令,并非對象。
作?:給super發(fā)消息,可以執(zhí)?父類該?法的實(shí)現(xiàn) 。
創(chuàng)建對象分兩步:
1.為對象開辟空間。
2.進(jìn)行初始化操作
初始化?法的主要作用是:為某些實(shí)例變量賦初值。
初始化?法在對象的整個?命周期?只使?一次。
初始化方法是在對象的初始化階段完成其實(shí)例變量的賦值操作,一個對象的初始化階段只有一次,所以初始化方法只使用一次。
- (id)init {
//給super發(fā)送init消息:執(zhí)行父類中實(shí)現(xiàn)的init方法
self = [super init];
//判斷從父類繼承過來的init方法是否初始化成功
if (self) {
//初始化設(shè)置
}
//返回初始化完成的對象
return self;
在?身的初始化?法中,優(yōu)先向super發(fā)送init消息,初始化公共變量,初始化成功之后,再初始化?身特有變量,從?完成全部實(shí)例變量的初始化
}
self是系統(tǒng)關(guān)鍵字。 self在方法中指代當(dāng)前方法的調(diào)用者。
self在實(shí)例方法中,指代調(diào)用當(dāng)前方法的對象。
- (void)objectMethod {
}
self在類方法中,指代當(dāng)前類。
+ (void)classMethod {
}
初始化?法是 “-”方法。
id或者instancetype類型的返回值。
以init開頭。
可以帶0到多個參數(shù)。
內(nèi)部實(shí)現(xiàn):先執(zhí)?super的初始化方法,再初始化?身變量,后return self
##
便利構(gòu)造器
封裝了對象創(chuàng)建過程:
內(nèi)部實(shí)現(xiàn):封裝了alloc和初始化操作,創(chuàng)建對象更加方便快捷。
* 便利構(gòu)造器是“+”方法。
* 返回 本類型 的實(shí)例。
* ?法名以類名開頭。
* 可以有0到多個參數(shù)。
* 例如:
聲明
(id)personWithName:(NSString *)name gender:(NSString *)gender;
實(shí)現(xiàn)
+ (id)personWithName:(NSString *)name gender:(NSString *)gender {
return [[Person alloc] initWithName:name gender:gender];
}
調(diào)用
Person *per = [Person personWithName:@"Frank" gender:@"男"];
繼承:
繼承是?向?qū)ο笕?特性之?,合理的繼承,能減少很多冗余代碼, 加快開發(fā)速度。
初始化?法以init開頭,在對象的生命周期中只使?一次。
便利構(gòu)造器封裝了對象的創(chuàng)建過程,進(jìn)?步簡化了對象創(chuàng)建的步驟。
一、setter、getter 二、屬性 三、屬性的特性 四、點(diǎn)語法
什么是setter方法?
在OC中,為單一實(shí)例變量賦值的方法稱為setter方法(設(shè)置器)。
什么是getter方法?
在OC中,讀取實(shí)例變量值的方法稱為getter方法(訪問器)。
舉例:
NSInteger _age;
setter方法的書寫格式如下:
- (void)setAge:(NSInteger)age;
注意:set+實(shí)例變量名(首字母大寫),忽略下劃線。
getter方法的書寫格式如下:
- (NSInteger)age;
注意:返回值類型與變量類型一致,方法與實(shí)例變量名相同,忽略下劃 線。
二、屬性
屬性是Objective-C 2.0定義的語法,提供setter、getter方法的默認(rèn)實(shí)現(xiàn)。在一定程度上簡化程序代碼,并且提高程序的安全性。
屬性的聲明:在.h文件中使用@property聲明屬性.
以實(shí)例變量_name為例:
屬性的聲明
@property NSString *name;
相當(dāng)于在@interface中聲明了兩個方法:
setter方法
- (void)setName:(NSString *)name;
getter方法
- (NSString *)name;
屬性的實(shí)現(xiàn):在.m文件使用@synthesize實(shí)現(xiàn)屬性
以實(shí)例變量_name為例:
屬性的實(shí)現(xiàn)
相當(dāng)于在@implementation實(shí)現(xiàn)了
setter方法
- (void)setName:(NSString *)name {
_name = name;
}
getter方法
- (NSString *)name {
return _name;
}
原子性控制(nonatomic、atomic)
atomic:原子特性,setter、getter方法在多線程訪問下是絕對安全的,即setter、getter內(nèi)部做了多線程訪問處理。默認(rèn)的原子特性。
nonatomic:非原子特性。setter、getter方法內(nèi)部不會做多線程訪問處理,僅僅是普通的setter、getter方法。
一般都用非原子特性(nonatomic)
例如: @property (nonatomic) NSString *name;
###屬性的特性-語義特性
語義設(shè)置(assign、retain、copy)
如果屬性是非對象類型(比如int、float等) 屬性的語義設(shè)置使用assgin.
如果屬性是對象類型(比如NSString等)屬性的語義設(shè)置使用retain.
如果屬性是對象類型并且想得到對象的副本,使用copy.(對于retain和copy的區(qū)別以及copy的使用場景,在之后講到內(nèi)存管理會詳細(xì)講解)
語義設(shè)置 — assign:
如果語義設(shè)置的關(guān)鍵字是assign。例如:nonatomic后面跟的是retain或者assign。他倆的區(qū)分:retain跟的是對象類型(NSString*這種類型用retain)assign(如:int)
@property (nonatomic, assign) NSInteger age;
setter方法內(nèi)部實(shí)現(xiàn):
- (void)setAge:(NSInteger)age {
_age = age;
}
getter方法內(nèi)部實(shí)現(xiàn):
- (NSInteger)age {
return _age;
}
如果語義設(shè)置的關(guān)鍵字是retain。例如:
@property (nonatomic, retain) NSString *name;
setter方法內(nèi)部實(shí)現(xiàn):
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name retain];
}
}
getter方法內(nèi)部實(shí)現(xiàn):
- (NSString *)name {
return [[_name retain] autorelease];
}
點(diǎn)語法的使用
只要符合系統(tǒng)默認(rèn)setter、getter書寫格式的方法都可以使用點(diǎn)語法。 例如:實(shí)例變量_name
setter方法
[person setName:@"Lily"];
使用點(diǎn)語法:
person.name = @"Lily";
getter方法
NSString *string = [person name];
使用點(diǎn)語法:
NSString *string = person.name;
屬性是一對getter、setter方法,點(diǎn)語法是屬性的另一種調(diào)用格式。