天天看點

018-繼承-OC筆記

1.【掌握】xcode開發文檔

2.【掌握】static關鍵字

3.【掌握】self關鍵字

4.【掌握】繼承

5.【掌握】nsobject

6.【掌握】通路修飾符

7.【掌握】私有執行個體變量和私有方法

8.【掌握】多态

9.【掌握】description

蘋果提供了很多的架構,每個架構中有很多類,每個類有很多方法,每個方法也有各種不同的用法。我們怎麼檢視這些架構裡的這些類裡的這些方法呢?蘋果為我們提供了一個全面、豐富、牛逼的開發文檔,隻要我們裝上就能随時檢視了。

安裝和檢視文檔

線上安裝:xcode -> preferences -> downloads -> documentation,選中需要下載下傳的直接下載下傳,國内下載下傳非常慢。(不推薦)

離線安裝:網上下載下傳離線包,複制到文檔路徑:

/applications/xcode.app/contents/developer/documentation/docsets裡。(推薦)

檢視文檔:window -> documentation and api reference 裡可檢視。

static關鍵字在oc中也能使用,但是不能修飾屬性也不能修飾方法。但可以修飾方法内部的局部變量,被static修飾的局部變量是靜态變量,存儲在常量區,當方法執行完畢之後,局部變量不會被回收。下次再聲明的時候不會再重新聲明一次,二是直接使用。

使用場景:當我們需要每次建立學生時就為學生自動指派學号

#import

@interface student : nsobject

{

    //學号

    int _studyid;

}

//_studyid的get方法聲明

- (int)studyid;

//執行個體化一個對象的類方法聲明

+ (student *)student;

@end

#import "student.h"

@implementation student

//_studyid的get方法實作

- (int)studyid{

    return _studyid;

//執行個體化一個對象的類方法實作

+ (student *)student{

    //将局部變量用static關鍵字修飾為靜态變量

    static int studyidtemp = 1;

    //執行個體化一個對象student

    student *student = [student new];

    //為student對象的_studyid執行個體變量指派局部變量studyidtemp

    student->_studyid = studyidtemp;

    //每次調用這個類方法執行個體化一個對象,studyidtemp自增1

    studyidtemp++;

    //傳回student對象給調用者

    return student;

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        //調用student的類方法執行個體化3個對象,會在類方法實作内部自動為學号指派

        student *student1 = [student student];

        student *student2 = [student student];

        student *student3 = [student student];

        nslog(@"他們的學号分别為student1 = %i student2 = %i student3 = %i",[student1 studyid],[student2 studyid],[student3 studyid]);

        //輸出 他們的學号分别為student1 = 1 student2 = 2 student3 = 3

    }

    return 0;

從上面例子不難得出,當我們希望一個方法内部的局部變量能被多次調用,在方法執行完畢後不被銷毀,這個時候我們就可以使用static來修飾我們的局部變量。

self與對象方法

在方法的實作内,是可以聲明一個和執行個體變量同名的局部變量,此時局部變量會屏蔽掉同名的執行個體變量的作用域(在局部變量的作用域範圍内屏蔽掉執行個體變量的作用域)。但是我們可以使用self來通路被屏蔽作用域的執行個體變量,這個時候self指針指向目前對象(誰調用就指向誰)。(ps:我也不知道這樣形容嚴謹不,就是這個意思哈,你懂就行)

如果方法中有一個局部變量和執行個體變量同名,要通路執行個體變量必須使用self,不過我們在開發中一定不要在方法實作内聲明和執行個體變量同名的變量。

應用案例:

@interface person : nsobject

    nsstring *_name;

    int _age;

//_name的set和get方法聲明

- (void)setname:(nsstring *)name;

- (nsstring *)name;

//_age的set和get方法聲明

- (void)setage:(int)age;

- (int)age;

#import "person.h"

@implementation person

//_name的set和get方法實作

- (void)setname:(nsstring *)name{

    nsstring *_name = @"同名變量";

    self->_name = name;//這裡就是将傳入的值指派給目前對象的執行個體變量_name

- (nsstring *)name{

    return _name;

//_age的set和get方法實作

- (void)setage:(int)age{

    int _age = 18;

    _age = age;//這裡不使用self則是指派給局部變量_age

- (int)age{

    return _age;

        //執行個體化一個p對象,并調用set方法指派

        person *p = [person new];

        [p setname:@"周劍峰"];

        [p setage:20];

        nslog(@"name = %@ age = %i",[p name],[p age]);

        //列印出 name = 周劍峰 age = 18

        //而不是 name = 周劍峰 age = 20

self與類方法

self也可以在類方法中使用,這個時候self指針指向目前類。是以我們就能通過self來調用其他類方法,并且強烈推薦使用這種方式來調用其他類方法,而不是通過類名來調用。

//聲明兩個類方法

+ (void)sayhi;

+ (void)sayhello;

//在類方法實作裡調用另一個類方法

+ (void)sayhi{

    nslog(@"類方法sayhi");

    [self sayhello];//建議使用self調用

    [person sayhello];//不建議使用類名調用

+ (void)sayhello{

    nslog(@"類方法sayhello");

        [person sayhi];

018-繼承-OC筆記

當多個類具有相同成員的時候,那麼這個時候就可以把相同的成員抽取出來定義到一個類中,讓其他類繼承這個類。當建立了繼承關系,子類(派生類)就擁有父類(基類)所有成員,并且子類可以重寫父類方法也能新增子類特有的方法和執行個體變量。

文法:@interface 子類類名 : 父類類名

//性别枚舉

typedef enum {

    gendermale,

    genderfemale

}gender;

    gender _gender;

//_name的set、get方法聲明

//_gender的set、get方法聲明

- (void)setgender:(gender)gender;

- (gender)gender;

//_age的set、get方法聲明

//父類吃食物方法聲明

- (void)eatwithfoodname:(nsstring *)foodname;

//_name的set、get方法實作

    _name = name;

//_gender的set、get方法實作

- (void)setgender:(gender)gender{

    _gender = gender;

- (gender)gender{

    return _gender;

//_age的set、get方法實作

    _age = age;

//父類吃食物方法實作

- (void)eatwithfoodname:(nsstring *)foodname{

    nslog(@"%@吃%@",self->_name,foodname);

//導入person類的頭檔案

//student類繼承person類

@interface student : person

//student類特有執行個體變量的set、get方法聲明

- (void)setstudyid:(int)studyid;

//student類特有學習方法

- (void)study;

//student類特有執行個體變量的set、get方法實作

- (void)setstudyid:(int)studyid{

    _studyid = studyid;

- (void)study{

    nslog(@"學生類特有的學習方法");

        student *stu = [student new];

        //繼承父類的執行個體變量

        [stu setname:@"周劍峰"];

        [stu setgender:genderfemale];

        [stu setage:20];

        //學生類的特有執行個體變量

        [stu setstudyid:2];

        //輸出學生的資訊

        nslog(@"name = %@ gender = %d age = %i studyid = %i",[stu name],[stu gender],[stu age],[stu studyid]);

        //繼承父類的方法

        [stu eatwithfoodname:@"米飯"];

        //子類特有的方法

        [stu study];

注意:

1.構成繼承關系的類,他們直接應該有所屬關系。比如學生是一個人(學生類繼承人類),狗是一個動物(狗是一個動物)。

2.從父類繼承的方法,不适用于子類時,可以直接聲明父類的同名方法,并定義(這就是重寫方法)。

3.子類重寫方法之後,在調用方法時,父類的對象調用父類的方法,子類的對象調用子類的方法,不會引起沖突。

4.子類重寫方法之後,子類可以通過super關鍵字調用父類的類方法(這裡的super也相當于一個指向父類的指針)。

5.隻要某個成員不是所有子類都擁有的,那麼這個成員就不應該定義在父類中。

6.一個類隻能有一個父類,objective-c不支援多繼承。

7.子類和父類中不能有同名的屬性。

8.super關鍵字用在子類對象方法中,可以調用目前子類繼承的父類的對象方法。

9.super關鍵字用在子類的類方法中,可以調用父類的類方法。

繼承的特點:

1.單根性:一個類隻能有一個父類,objective-c不支援多繼承。

2.傳遞性:當a類繼承b類,b類又繼承自c類。b類繼承了c類所有成員,a類又繼承了b類所有成員(包括b類繼承的c類所有成員)。

要執行個體化一個對象,必須要調用這個類的類方法new,而這個方法定義在nsobject之中。是以,為了保證我們的類擁有建立對象的能力,那麼我們的類必須直接或間接的從nsobject類繼承。

nsobject類是所有類的基類,在這個類中定義了一個執行個體變量isa指針,指向代碼區中類的位址。

通路修飾符是用來修飾類的執行個體變量的,被不同通路修飾符修飾的執行個體變量的通路權限是不同的。是以,通路修飾符的作用就是用來限制執行個體變量的通路權限的。

@public 共有的

被@public關鍵字修飾的執行個體變量可以通過對象名在任意的地方通路。

@protected 受保護的

被@protected關鍵字修飾的執行個體變量隻能在本類和他的子類通路。如果執行個體變量沒有被通路修飾符修飾,預設修飾符就是@protected。

@private 私有的

被@private關鍵字修飾的執行個體變量隻能在本類的内部通路,子類能繼承私有成員,但在子類方法實作中無法通路繼承的私有成員。

@package 包權限

被@package關鍵字修飾的執行個體變量隻能在目前架構中通路。

私有執行個體變量

将執行個體變量定義在@implementation中,這些執行個體變量就是私有執行個體變量,這些私有執行個體變量隻能在本類中通路,不能在其他地方通路,并且xcode都不提示類中存在的私有執行個體變量。注意:這種情況可以在子類中定義和父類私有執行個體變量同名的執行個體變量。

    //定義在這裡的執行個體變量隻能在本類中通路

私有方法

沒有方法的聲明,隻有方法的實作。這樣的方法就隻能在類的内部調用。

多态就是父類指針指向子類對象

1.當方法的參數是一個父類類型的時候,那麼傳遞的實參可以是父類對象也可以是子類對象。

2.當一個父類指針指向一個子類對象的時候,隻能通過父類指針通路子類對象中的繼承成員,子類獨有的不能通路。

多态的好處

多态的主要好處就是簡化了程式設計接口。它容許在類和類之間重用一些習慣性的命名,而不用為每一個新加的函數命名一個新名字。這樣,程式設計接口就是一些抽象的行為的集合,進而和實作接口的類的區分開來。

多态也使得代碼可以分散在不同的對象中而不用試圖在一個函數中考慮到所有可能的對象。這樣 使得代碼擴充性和複用性更好一些。當一個新的情景出現時,無須對現有的代碼進行改動,而隻需要增加一個新的類和新的同名方法。

%@是專門用來輸出對象的,預設情況下,我們将對象以%@的格式輸出,輸出的是

<對象所屬的類名:對象的位址>

nslog(@"%@",對象名);輸出一個對象的時候,會先調用傳入對象的description方法,這個方法的傳回值是字元串(nsstring *),然後将這個字元串輸出。我們可以重寫description方法,輸出我們需要輸出的任意内容。

- (nsstring *)description{

    nsstring *str = @"<<重寫了description方法>>";

    return str;

這個時候我們在使用nslog(@"%@",對象名);輸出的是

<<重寫了description方法>>

溫馨提示:歡迎分享本文,轉載請保留出處!

轉自:http://blog.csdn.net/qq_31810357