1. 程式人生 > >黑馬程式設計師——OC基礎——構造方法

黑馬程式設計師——OC基礎——構造方法

-----------android培訓java培訓、java學習型技術部落格、期待與您交流!------------

前面我們用OC的類建立物件的時候我們用的是new方法。其實new方法是一個組合的方法,它是由兩個方法組合在一塊的,分別是alloc方法和init方法。其中alloc方法是類方法,它是用來給物件分配一個儲存空間的,init方法是物件方法,它是用來對物件進行初始化的,init方法也叫做構造方法。

在OC中,我們通常要重寫init方法以便在初始化的時候就給成員變數賦上一些值,所以我們在建立物件的時候最好不要用new方法,因為這樣我們就不能重寫構造方法了。那麼怎麼重寫init方法呢?重寫init方法的步驟:

1、呼叫父類的init方法。這是為了先初始化父類中宣告的成員變數和其他屬性。

2、判斷物件是否初始化成功,成功的話再對子類的成員變數進行初始化。

3、返回初始化的物件。

下面我們建立一個Person類,類中定義了一個int型別的成員變數_age,下面我們建立一個Person類的物件並對其初始化,使_age的值為20。

#import <Foundation/Foundation.h>

// Person類的宣告
@interface Person : NSObject
@property int age;
@end

// Person類的實現
@implementation Person
// 重寫init方法
- (id)init
{
    // 判斷父類的初始化是否完成,完成的話對_age進行初始化
    if (self = [super init]) {
        _age = 20;
    }
    
    // 返回初始化完成後的物件
    return self;
}
@end

int main()
{
    // 建立一個Person類的物件
    Person *p = [[Person alloc] init];
    // 輸出_age的值
    NSLog(@"_age = %d", p.age);
    
    return 0;
}

上面是對Person類的p物件進行初始化並使_age的值在初始化完成後就是20。

重寫init方法的注意點:先呼叫父類的init方法[super init],再對子類的成員變數初始化。

那麼我們可不可以不在類中給成員變數賦初值,而是在其他地方賦值呢?

在其他地方賦初值的話就要重新定義init方法,下面我們學習在main函式中傳入成員變數的初值。

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;

// 重新設計構造方法需要先宣告
- (id)initWithAge:(int)age;
@end

@implementation Person
// 重新設計的構造方法並初始化_age
- (id)initWithAge:(int)age
{
    if (self = [super init]) {
        _age = age;
    }
    return self;
}
@end

int main()
{
    // 建立一個Person類的物件,呼叫重新設計的構造方法並傳入賦給_age的值
    Person *p = [[Person alloc] initWithAge:23];
    // 輸出_age的值
    NSLog(@"_age = %d", p.age);
    
    return 0;
}

上面程式碼輸出結果是:

_age = 23

自定義構造方法的注意點是:

1、以“-”號開頭,也就是必須是物件方法。

2、返回值一般是id型別。

3、方法名一般以initWith開頭。

下面我們學習子類繼承父類時怎麼設計構造方法。

#import <Foundation/Foundation.h>

// Person類的宣告和實現
@interface Person : NSObject
@property int age;
// 設計的構造方法的宣告
- (id)initWithAge:(int)age;
@end
@implementation Person
// 設計的構造方法的實現
- (id)initWithAge:(int)age
{
    if (self = [super init]) {
        _age = age;
    }
    return self;
}
@end

// Student類的宣告和實現
@interface Student : Person
@property double score;
// 設計的建構函式的宣告
- (id)initWithAge:(int)age andScore:(double)score;
@end
@implementation Student
// 設計的構造方法的實現
- (id)initWithAge:(int)age andScore:(double)score
{
    //呼叫了父類重新設計的構造方法
    if (self = [super initWithAge:age]) {
        _score = score;
    }
    return self;
}
@end

int main()
{
    // 建立一個Student類的物件,呼叫重新設計的構造方法並傳入_age和_score的值。
    Student *s = [[Student alloc] initWithAge:18 andScore:92];
    // 輸出_age的值
    NSLog(@"_age = %d, _score = %.1f", s.age, s.score);
    
    return 0;
}

上面的程式碼的重點是在子類的構造方法中呼叫了父類的構造方法。在設計構造方法中,如果子類需要對父類的成員變數進行初始化且父類中已經定義了對該成員變數初始化的init方法,我們就要呼叫父類的構造方法。也就是說,父類的屬性交給父類來處理,子類的給子類來處理。

以上就是構造方法的簡單介紹。我們來總結幾個重點:

1、如果需要在初始化的時候就給成員變數賦值,我們就要重寫init方法,也就是構造方法。

2、重寫構造方法的時候一定要呼叫父類的構造方法。

3、設計構造方法的時候記得父類的屬性交給父類處理。

4、構造方法必須是物件方法。

相關推薦

黑馬程式設計師——OC基礎——構造方法

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 前面我們用OC的類建立物件的時候我們用的是new方法。其實new方法是一個組合的方法,它是由兩個方法組合在一塊的,分別是alloc方法和init方法。其

黑馬程式設計師--OC基礎--類方法、物件方法和self的使用

1、類方法 (1)類方法就是一個方法,它的使用不需要使用者去建立一個類的例項進行呼叫而可以直接通過類名對方法進行呼叫。 宣告一個類方法的格式: +(返回值型別) 方法名:(引數1型別)引數1名稱 方法名:(引數2型別)引數2名稱; 例:

黑馬程式設計師——OC基礎——set方法和get方法

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 我們在OC中定義一個類的時候,它的成員變數預設情況下是@protected的。這是因為我們的成員變數一般不允許直接去訪問,如果需要修改和訪問成員變數我們

黑馬程式設計師 OC基礎: 記憶體管理

記憶體管理 簡述 每個 oc 物件都有自己的引用計數器,是一個整數,表示”物件被引用的次數”.佔四位元組 計數器預設值為1 當為0時,物件佔用的記憶體會被系統回收. 引用的操作 給物件傳送一條 retain 計數器+1 給物件傳送一

黑馬程式設計師——OC基礎---Foundation框架之結構體

一、概述 Foundation—基礎框架。框架中包含了很多開發中常用的資料型別,如結構體,列舉,類等,是其他ios框架的基礎。 如果要想使用foundation框架中的資料型別,那麼包含它的主標頭檔案就可以了。 即#import #import &l

黑馬程式設計師——OC基礎—記憶體管理

=== 記憶體管理機制 === OC的區域性變數在程式碼塊結束時被系統銷燬, 記憶體被回收. OC的物件, 內部有引用計數器, 當引用計數器的值為0時, 被系統銷燬, 記憶體被回收. 區域性變數存放在棧中. 物件存放在堆中. 注意, 物件指標還是存放在棧中, 物件本身佔用的記憶體存放在堆中. 在OC

黑馬程式設計師——OC基礎---記憶體管理

1. 控制set方法的記憶體管理 retain : release舊值,retain新值(用於OC物件)  assign : 直接賦值,不做任何記憶體管理(預設,用於非OC物件型別) copy   : release舊值,copy新值(一般用於NSString *) 2.  控制需不需生成set方法 re

黑馬程式設計師——OC基礎——記憶體管理(一)

一,為什麼要進行記憶體管理 1,由於移動裝置的記憶體有限,所以每個APP所佔的記憶體也是有限制的,當APP所佔用的記憶體較多時,系統就會發出警告,這時就需要回收一些不需要繼續使用的記憶體空間,比如回收一些不再使用的物件和變數等。 任何繼承NSObject的物件,對其他的基

黑馬程式設計師------OC基礎-----記憶體管理

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ------- 法則 誰建立記憶體誰就要釋放記憶體 管理機制 引用計數器 1使用alloc(相當於C語言中的malloc)為物件分配記憶體,使用dealloc(相當與C語言中的fre

黑馬程式設計師--OC基礎[email protected]和@synthesize

1、@property關鍵字 (1)基本概念 @property是編譯器指令,所謂編譯器指令,就是告訴編譯器要做什麼。 @property告訴編譯器宣告屬性的訪問器(setter/getter)方法,這樣的好處是免去了程式設計師編寫set和get的

黑馬程式設計師——OC語言基礎——面向物件三大特性之多型

繼前兩篇博文梳理了一下我對OC中面向物件三大特性的封裝、繼承之後。最重要也是最不容易理解的多型概念終於到來。 個人認為多型在三大特性中是最為重要的,但是由於它的概念性不容易用語言描述清楚,所以我還是想引用視訊教程中老師說的那句經典。 多型的實質就是: 父類的指標 指向了

黑馬程式設計師 oc隨記 類方法與物件方法

------- android培訓、java培訓、ios培訓、期待與您交流! ---------- 類方法與物件方法相比較,最根本的好處在於節省記憶體空間。 物件方法在執行時是先從記憶體棧區訪問記憶體堆區的地址,再從記憶體堆區尋找方法位於記憶體程式碼區的地址,最終返回值。

黑馬程式設計師OC語言基礎—記憶體管理

之前我們已經提到過C語言中的記憶體儲存空間。有五大區域:堆、棧、自由儲存區、全域性\靜態儲存區和常量儲存區。 OC是以C語言為基礎的,所以也分這五大區域。 下面我們討論一下OC中記憶體管理的規律。 一、引用計數器 1.每個OC物件都有自己的引用計數器,是一個整數,即物件被

黑馬程式設計師——IOS基礎——OC記憶體管理

=====================引用計數器開始==================== 基本型別資料存放在棧中,物件存放在堆中 棧中的資料系統自動回收 堆空間中的資料動態分配,不能自動分配,容易引起記憶體洩露 需要給物件傳送訊息,讓它回收,即呼叫物件的回收方法

黑馬程式設計師-OC-類方法和物件方法的呼叫

1.類方法 宣告:在.h檔案中宣告,必須以+開頭。 實現:在.m檔案中實現 2.物件方法 宣告:在.h檔案中宣告,必須以-開頭。 實現:在.m檔案中實現 對比: 1)類方法只能類呼叫,物件方法只能物件呼叫 2)類方法與物件方法可以

黑馬程式設計師_java基礎學習筆記之(建構函式&構造程式碼塊&靜態程式碼塊)的區別

在基礎學習中,我常常會概念模糊,特作此學習筆記,進行一下對比,思路自然就清晰了。 建構函式 建構函式定義:建構函式是與類名相同,但沒有返回值的函式。 例子: class Person {     //建構函式     public Person() {} } 作用:

黑馬程式設計師-OC學習筆記-點方法、成員變數作用域以及set方法和get方法@property的綜合題

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.  OC建立物件的拓展: Frac

黑馬程式設計師OC—類方法 && self

*** 類方法 *** 宣告和實現: @interface Person : NSObject + (void) age;  //宣告一個類方法 @end @implementation Person + (void) age   //類方法的實現 {

黑馬程式設計師----Java基礎之反射

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之GUI

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g