OC語(yǔ)言day03-06self關(guān)鍵字基本概念(類方法使用場(chǎng)景)

pragma mark 項(xiàng)目1:self關(guān)鍵字基本概念(類方法使用場(chǎng)景)

pragma mark 概念

/**
 如果self在 對(duì)象方法中, 那么self就是 代表 調(diào)用當(dāng)前對(duì)象方法 的 那個(gè)對(duì)象
 如果self在 類方法中, 那么 self 就 代表 調(diào)用當(dāng)前類方法 的那個(gè)類
 
 總結(jié):
 我們只要關(guān)注 self 在那一個(gè)方法中,
 如果在 類方法 那么就代表當(dāng)前 類,
 如果在 對(duì)象方法 那么就 代表 "當(dāng)前 調(diào)用該方法的 對(duì)象"
 */
#pragma mark 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Iphone.h"
#pragma mark main函數(shù)
int main(int argc, const char * argv[])
{
#warning self 不能離開(kāi)類, 離開(kāi)類之后沒(méi)有任何意義
    
    [Iphone carameWithFlahLightStatus:FlahLightStatusOpen];
    return 0;
}
Iphone.h // 手機(jī)類
#import <Foundation/Foundation.h>

// 是否打開(kāi)閃光燈
typedef enum
{
    
    FlahLightStatusOpen,
    kFlahLightStatusClose
    
}kFlahLightStatus;

@interface Iphone : NSObject
{
    int _cpu;
}

/**
 *  根據(jù)閃光燈的狀態(tài)拍照
 *
 *  @param status 閃光燈的狀態(tài) (開(kāi)、關(guān))
 */
// 沒(méi)有使用到成員變量 不需要使用對(duì)象方法
// 使用類方法
+ (void)carameWithFlahLightStatus:(kFlahLightStatus)status;

/**
 *  打開(kāi)閃關(guān)燈
 */
+ (void)openFlahLight;
+ (void)closeFlahLight;

@end

Iphone.m
#import "Iphone.h"

@implementation Iphone

// 沒(méi)有使用到成員變量 不需要使用對(duì)象方法
/**
 類方法中 可以 直接調(diào)用 類方法
 類方法中 不可以 直接調(diào)用 類方法
 類方法中 不能訪問(wèn)成員變量
 */
+ (void)carameWithFlahLightStatus:(kFlahLightStatus)status
{
    if (status == FlahLightStatusOpen)
    {
        // 使用類名 調(diào)用
//        [Iphone openFlahLight];
        // 其實(shí) 在類方法中 調(diào)用類方法 除了可以使用類名 調(diào)用以外, 還可以使用self來(lái)調(diào)用
        // self == 類名
        [self openFlahLight];   // 控制臺(tái)輸出的self就是 Iphone類
    }
    else
    {
        // 使用類名 調(diào)用
//        [Iphone closeFlahLight];
        
        [self closeFlahLight];
    }
    NSLog(@"拍照");
}

+ (void)openFlahLight
{
    NSLog(@"打開(kāi)閃關(guān)燈");
}

+ (void)closeFlahLight
{
    NSLog(@"關(guān)閉閃關(guān)燈");
}
@end

pragma mark 項(xiàng)目2:self 關(guān)鍵字2 (對(duì)象方法使用場(chǎng)景)

pragma mark 概念

#pragma mark 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Iphone.h"
#pragma mark main函數(shù)
int main(int argc, const char * argv[])
{
    Iphone *p  =[Iphone new];
    NSLog(@"p = %p",p);
    [p carameWithFlahLightStatus:FlahLightStatusOpen];
    
    return 0;
}

Iphone.h // 手機(jī)類
#import <Foundation/Foundation.h>

// 是否打開(kāi)閃光燈
typedef enum
{
    
    FlahLightStatusOpen,
    kFlahLightStatusClose
    
}kFlahLightStatus;

@interface Iphone : NSObject
{
    int _cpu;
}

/**
 *  根據(jù)閃光燈的狀態(tài)拍照
 *
 *  @param status 閃光燈的狀態(tài) (開(kāi)、關(guān))
 */
// 沒(méi)有使用到成員變量 不需要使用對(duì)象方法
// 使用類方法
- (void)carameWithFlahLightStatus:(kFlahLightStatus)status;

/**
 *  打開(kāi)閃關(guān)燈
 */
- (void)openFlahLight;
- (void)closeFlahLight;

@end
Iphone.m
#import "Iphone.h"

@implementation Iphone

/**
 如果self在 對(duì)象方法中, 那么self就是 代表 調(diào)用當(dāng)前對(duì)象方法 的 那個(gè)對(duì)象
 如果self在 類方法中, 那么 self 就 代表 調(diào)用當(dāng)前類方法 的那個(gè)類
 
 總結(jié):
 我們只要關(guān)注 self 在那一個(gè)方法中, 
 如果在 類方法 那么就代表當(dāng)前 類,
 如果在 對(duì)象方法 那么就 代表 "當(dāng)前 調(diào)用該方法的 對(duì)象"
 */
- (void)carameWithFlahLightStatus:(kFlahLightStatus)status
{
    if (status == FlahLightStatusOpen)
    {
        NSLog(@"self = %p",self);
        // 其實(shí)self 不僅僅可以調(diào)用 我們的類方法, 還可以調(diào)用對(duì)象方法
        // self == 對(duì)象 == p
        [self openFlahLight]; // 控制臺(tái)輸出的self 是一個(gè)指針 就是 Iphone類的對(duì)象
    }
    else
    {
        [self closeFlahLight];
    }
    NSLog(@"拍照");
}

- (void)openFlahLight
{
    NSLog(@"打開(kāi)閃關(guān)燈");
}

- (void)closeFlahLight
{
    NSLog(@"關(guān)閉閃關(guān)燈");
}
@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容