您好,登錄后才能下訂單哦!
一,
關(guān)于OC的實(shí)例變量的可見(jiàn)度,即實(shí)例變量的訪問(wèn)權(quán)限有三種:
1),@public 公有的
被@public修飾的實(shí)例變量是公共的,即沒(méi)有訪問(wèn)權(quán)限,在任何文件中都可以訪問(wèn),(訪問(wèn)方式是通過(guò)對(duì)象+指向操作符)
2),@protected 受保護(hù)的
被@protected修飾的實(shí)例變量有一定的訪問(wèn)限,只允許在本類文件及子類文件中訪問(wèn),其他文件不可訪問(wèn)
3),@private 私有的
被@private 修飾的實(shí)例變量,只允在在本類文件中訪問(wèn),不可以在子類文件以及其他文件中訪問(wèn).
這里可以說(shuō)下私有方法;私有方法即沒(méi)有在.h文件中聲明,之間在.m文件中實(shí)現(xiàn)的方法,它只允許本類調(diào)用,外部無(wú)法訪問(wèn),即使是子類也無(wú)法訪問(wèn)
二,
我們通常在定義實(shí)例變量的時(shí)候一般都不再聲明變量的訪問(wèn)權(quán)限,OC默認(rèn)的是@protected,因?yàn)?/span>OC面向對(duì)象的三大特性:封裝,繼承,多態(tài).如果聲明為public外部就可以訪問(wèn)以及修改會(huì)影響內(nèi)部的一個(gè)實(shí)現(xiàn),暴漏實(shí)現(xiàn)細(xì)節(jié),不能體現(xiàn)OC面向對(duì)象的封裝特性(封裝的思想是隱藏內(nèi)部的實(shí)現(xiàn)).如果聲明為private,子類文件就不可以訪問(wèn)該實(shí)例變量,這樣子類文件需重新定義聲明,這樣違背了OC面向對(duì)象的繼承特性,(繼承是指父類的所有實(shí)例變量和方法等子類都可以訪問(wèn)使用.
當(dāng)定義為protected又需要對(duì)該變量重新賦值時(shí),可以利用設(shè)置器,即setter方法針對(duì)每個(gè)實(shí)例變量設(shè)置一個(gè)方法為它賦值,同時(shí)利用訪問(wèn)器,即getter方法針對(duì)每個(gè)實(shí)例變量設(shè)置一個(gè)方法來(lái)獲取它的值
如:舉個(gè)人這個(gè)類的例子 類名為Person
其實(shí)例變量為:
{
NSString *_name; //姓名
NSString *_sex; //性別
NSInteger _age; //年齡
}
1,設(shè)置器,getter方法
1)為_name賦值
- (void)setName:(NSString*)name;
2)為_sex賦值
- (void)setSex:(NSString*)sex;
3)為_age賦值
-(void)setAge:(NSInteger)age;
2,訪問(wèn)器 getter方法
1)讀取_name的值
- (NSString *)name;
2)讀取_sex的值
- (NSString *)sex;
3)讀取_age的值
- (NSInteger)age;
三,
類的繼承
1,當(dāng)多個(gè)類出現(xiàn)部分相同的實(shí)例變量和方法時(shí)就要考慮用繼承, 繼承時(shí)將多個(gè)類中相同的實(shí)例變量的方法提出來(lái)寫成一個(gè)公共的父類.
子類繼承父類: 會(huì)將父類中除了聲明為@private的實(shí)例變量以及私有方法外,其余內(nèi)容都會(huì)被繼承們所有如果子類中有和父類同樣的內(nèi)容,可以全部刪除.
私有方法 :即沒(méi)在.h文件中聲明,只在,m文件中實(shí)現(xiàn)了該方法,對(duì)于私有方法不允許外部訪問(wèn),只能讓本類調(diào)用訪問(wèn)
一個(gè)類繼承另一個(gè)類時(shí)要在.h文件的@interface開(kāi)頭地方把它的父類寫在:號(hào)后面如,一個(gè)學(xué)生類Student繼承了Person類
@interface Student:Person
2,繼承時(shí)方法存在三種:
1),保留父類對(duì)該方法的實(shí)現(xiàn),(實(shí)現(xiàn)方法不重寫)
2),按子類重寫后的方式來(lái)實(shí)現(xiàn)(實(shí)現(xiàn)方式重寫方法,寫自己的實(shí)現(xiàn)體完全忽略父類的實(shí)現(xiàn))
3),對(duì)于該方法既有父類的方法實(shí)現(xiàn)也有子類對(duì)該方法的實(shí)現(xiàn),在這種情況下我們一般在方法的實(shí)現(xiàn)內(nèi)容里先把調(diào)用父類方法的實(shí)現(xiàn)即用[super (方法)]這個(gè)方法名是就是繼承過(guò)來(lái)的方法名,然后再實(shí)現(xiàn)子類特有的行為
3,這里需要重點(diǎn)說(shuō)一下繼承類時(shí)自定義初始化的實(shí)現(xiàn)方法
首先自定義初始化的方法名必須是init+Whith開(kāi)頭,返回值是(id),是”-”號(hào)方法,
當(dāng)子類有獨(dú)有的實(shí)例變量時(shí)如:
{
NSString *_num;
NSString *_course;
}
多了一個(gè)學(xué)號(hào)和課程,初始化時(shí)子類只對(duì)自己獨(dú)有的實(shí)例變量賦值即可,super調(diào)用父類對(duì)初始化方法的實(shí)現(xiàn),為從父類繼承過(guò)來(lái)的實(shí)例變量賦值,這里的self還是調(diào)用方法時(shí)的值返回給自己,誰(shuí)調(diào)用就返回給誰(shuí),如果賦值不成功即self == nil,這時(shí)子類不在賦值,因?yàn)槿绻割惖膶?shí)例變量賦值失敗了,子類的賦值也就毫無(wú)意義了
-(id)initWithname:(NSString*)name sex:(NSString *)sex age:(NSInteger)age num:(NSString *)numcourse:(NSString *)course
{
self = [super initWithname:name sex:sexage:age];
if(self != nil) {
_course= course;
_num= num;
}
return self;
}
四,便利構(gòu)造器
我們?cè)趍ain函數(shù)里創(chuàng)建對(duì)象接收消息時(shí)往往在創(chuàng)建對(duì)象時(shí)需要給對(duì)象開(kāi)辟空間和初始化,這樣可能比較麻煩, 我們?cè)诙x類的時(shí)候直接實(shí)現(xiàn)為對(duì)象開(kāi)辟空間,即便利構(gòu)造器
作用:快速創(chuàng)建對(duì)象,內(nèi)部封裝了創(chuàng)建對(duì)象的過(guò)程,
格式: 1. +號(hào)方法,
2, 返回值為id類型,
3, 以類名+With開(kāi)頭,拼接上多個(gè)參數(shù)
還以上述學(xué)生類Student類繼承人類Person為例
1)在.h文件里寫方法的聲明,
在這里該方法為”+”號(hào)方法
+ (id)studentWithname:(NSString *)name sex:(NSString*)sex age:(NSInteger)age num:(NSString *)num course:(NSString *)course;
2)在.m文件里寫方法的實(shí)現(xiàn)
+ (id)studentWithname:(NSString *)name sex:(NSString*)sex age:(NSInteger)age num:(NSString *)num course:(NSString *)course
{
return [[Studentalloc] initWithname:name sex:sex age:age num:num course:course];
}
五,
類的循環(huán)調(diào)用的有關(guān)問(wèn)題
該問(wèn)題一般用于解決一個(gè)類實(shí)例變量里需要用到另一個(gè)類的所有變量
例如一個(gè)家庭類,成員有爸爸,媽媽,兒子,這三個(gè)類建立每個(gè)都需要另一個(gè)類的內(nèi)容如爸爸類實(shí)例變量有姓名年齡,妻子,兒子. 這里妻子和兒子的類型就是妻子類和兒子類的類名 + * ,這時(shí)要循環(huán)調(diào)用,在遇到循環(huán)調(diào)用時(shí)需要導(dǎo)入文件,但是這里的導(dǎo)入文件不能直接在該類的.h文件用”#import “頭文件”” 導(dǎo)入文件,因?yàn)檫@個(gè)類還沒(méi)有定義,無(wú)法識(shí)別,再使用該類時(shí)不能把它當(dāng)做一個(gè)類而所以在該類的.h文件里使用”@ class + 要調(diào)用的類名”,將要調(diào)用的類聲明為一個(gè)字符串,但是它不具備的類的內(nèi)容 ,所以要在該類的.m文件里用”#import“頭文件””導(dǎo)入頭文件.下面舉個(gè)家庭的例子
1)男人類
(.h文件里)
@class Woman;
#import "Child.h"
@interface Man : NSObject
{
NSString*_name; //姓名
NSString*_sex; //性別
NSInteger_age; //年齡
Woman*_wife; //妻子
}
//設(shè)置妻子
- (void)setWife:(Woman *)wife;
//設(shè)置孩子
- (void)setChild:(Child *)baby;
//訪問(wèn)姓名
- (NSString *)name;
//為_(kāi)sex賦值
- (void)setSex:(NSString *)sex;
//為_(kāi)age賦值
- (void)setAge:(NSInteger)age;
- (id)initWithName:(NSString *)name Sex:(NSString*)sex Age:(NSInteger)age;
//輸出一個(gè)人的信息
- (void)print;
@end
(.m文件里)
#import "Man.h"
#import "Woman.h"
@implementation Man
- (void)setWife:(Woman *)wife
{
_wife =wife;
}
- (void)setChild:(Child *)baby
{
_baby =baby;
}
//訪問(wèn)姓名
- (NSString *)name
{
return_name;
}
//為sex賦值
- (void)setSex:(NSString *)sex
{
_sex =sex;
}
//為age賦值
- (void)setAge:(NSInteger)age
{
_age =age;
}
- (id)initWithName:(NSString *)name Sex:(NSString*)sex Age:(NSInteger)age
{
_name =name;
_sex =sex;
_age =age;
returnself; }
-(void)print
{
NSLog(@"I am a man,My name is %@,My wife's name is %@, My baby'sname is %@",_name,[_wife name],[_baby name]);
}
其中女人類和孩子類跟男人類相似,只是調(diào)用的類有所不同,這里不再贅述
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。