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

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

1、類方法

(1)類方法就是一個方法,它的使用不需要使用者去建立一個類的例項進行呼叫而可以直接通過類名對方法進行呼叫。
宣告一個類方法的格式:

    +(返回值型別) 方法名:(引數1型別)引數1名稱 方法名:(引數2型別)引數2名稱;
 例:
    +(double)sumOfNum1: (double)num1 andNum2: (double)num2;
    其中double是返回值型別以及引數的型別,sumOfNum1:和andNum2:是方法名(注意冒號也屬於方法名內的),num1和num2是引數1和2的名稱  

(2)類方法的呼叫格式:

        [類名 類方法名];

例如:

#import <Foundadion/Foundation.h>
//類的宣告
@interface Caculator : NSObject
+(int)add: (int)num1 and: (int)num2;
@end
//類的實現
@implementation Caculator
+(int)add: (int)num1 and: (int)num2{
    return num1+num2;
]
@end
int main(){
    //通過Caculator呼叫類方法
    int result=[Caculator add:10 and:20];
    NSLog
(@"result = %d",result);//返回結果是30 return 0; }

2、物件方法

(1)物件方法是和類方法相對應的,物件方法的使用必須要由物件呼叫。
宣告一個物件方法的格式:

    -(返回值型別) 方法名:(引數1型別)引數1名稱 方法名:(引數2型別)引數2名稱;
 例:
    -(double)sumOfNum1: (double)num1 andNum2: (double)num2;
    其中double是返回值型別以及引數的型別,sumOfNum1:和andNum2:是方法名(注意冒號也屬於方法名內的),num1和num2是引數1和2的名稱  

可以看到物件方法和類方法的宣告只有+和-之分,而且只有呼叫的時候才有所區分。
例如:

#import <Foundadion/Foundation.h>
//類的宣告
@interface Caculator : NSObject
-(int)jian: (int)num1 and: (int)num2;  //方法的宣告
@end
//類的實現
@implementation Caculator
-(int)jian: (int)num1 and: (int)num2{  //方法的實現
    return num1-num2;
]
@end
int main(){
    Caculator *ca1=[Caculator new];//建立一個物件
    //通過ca1呼叫物件方法
    int result=[ca1 jian:20 and:10];
    NSLog(@"result = %d",result);//返回結果是10
    return 0;
}

3、注意事項

1–類方法可以和物件方法同名,這個並不影響使用。類方法由類呼叫,物件方法由物件呼叫,兩者不會有交叉相互影響。
2–類方法也可以是從弗雷繼承而來的,子類可以重寫類方法,如 description這個方法就可以在子類中重新定義這個方法,也就是重寫這個方法。
3–類方法和物件方法都在interface裡宣告,在implementation裡實現。
4–在類方法中不能使用類的成員變數。
5–在類方法中可以直接使用其他類方法,也可以呼叫物件方法。
6–物件方法中可以呼叫其他的物件方法。
7–類方法和物件方法中都可以使用self。
8–物件可以作為方法的引數進行傳遞。
9–類方法中不能呼叫自身,否則會出現死迴圈。

4、self的使用

OC中提供了兩個保留字self和super,用於在方法定義中引用該方法的物件。
OC中的self相當於c++、Java中的this指標。
self的應用場景:
1)用在類方法中
2)用在物件方法中
3)訪問成員變數
4)在OC的記憶體管理中特殊的使用

(1)在類方法中使用self
self在類方法中使用其指代的是當前類。
例:

#import <foundation/Foundation.h>
//類的宣告
@interface Person : NSObject
+(void)run;
@end
//類的實現
@implementation Person 
+(void)run{
    NSLog("人在跑!");
    NSLog("self=%p",self);//返回self的地址
}
@end

int main(){
    Person *p=[Person new];
    [p class]實質就是返回的當前類(類物件)
    NSLog("Person=%p",[p class]);//返回當前類的地址
    [Person run];//通過Person呼叫類方法run
    return 0;
}
//通過結果我們能發現self和當前類的地址一樣,從而證明了self在類方法中指代的就是當前的類

(2)在物件方法中使用self
self在物件方法中使用其指代的是呼叫當前方法的物件。
例:

#import <foundation/Foundation.h>
//類的宣告
@interface Person : NSObject
-(void)run;
-(void)eat:(NSString*)foodName;
@end
//類的實現
@implementation Person
-(void)run{
    NSLog("人在跑!");
} 
-(void)eat:(NSString*)foodName{
    NSLog("人在吃飯%@",foodName);
    NSLog("self = %p",self);//返回self的地址
    [self run];
}
@end

int main(){
    Person *p1=[Person new];
    [p1 eat:@"雞蛋"];//通過p1呼叫物件方法eat
    NSLog("p1 = %p",p1);
    return 0;
}
//通過結果我們能發現self和當前物件p1的地址一樣,從而證明了self在物件方法中指代的就是當前物件

(3)self修飾成員變數
self在物件方法中,也是通過self->屬性名稱的方式訪問成員變數
應用場景:當存在區域性變數名和成員變來那個名同名時
例如:在一個物件方法中,形參名和成員變數名相同的情況

    @interface Car:NSObject{
        int _speed;
    }
    -(void)setSpeed:(int)_speed;
    @end
    @implementation Car
    -(void)setSpeed: (int)_speed{
        _speed=_speed;//此時,_speed指的是區域性變數,區域性變數會遮蔽成員變數,此時對成員變數賦值不成功
        self->_speed = _speed;//此時的self指向的_speed就是類中的成員變數,從而達到賦值的效果
    }
    @end

5、self的使用注意事項

1–self誰呼叫當前方法,self就代表誰
2–self在物件方法中,self代表當前物件
3–self在類方法中,self代表類
4–[self 方法名];呼叫其他方法
5–self可以簡單的理解為自己
6–同時有物件方法和類方法存在的時候,self不會調錯

相關推薦

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

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

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

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

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

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

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

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

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

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

黑馬程式設計師—java基礎加強—內省註解泛型

---------------------- android培訓、java培訓、期待與您交流! -------------------- 內省:IntroSpector——》JavaBean——特殊的Java類 當Java執行時可檢查自身,Java 程式中詢問它的一個物

黑馬程式設計師——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的

黑馬程式設計師_基礎加強_Java執行緒通訊執行緒併發庫

 ------- android培訓、java培訓、期待與您交流! ---------- java5的執行緒鎖技術 Lock&Condition實現執行緒同步通訊 Lock比傳統的synchronized方式更加面向物件,兩個執行緒執行的程式碼塊要實現同步互斥,

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

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

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

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

黑馬程式設計師-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基礎之IO包中其它

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

黑馬程式設計師----Java基礎之集合(一)

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

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

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

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

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