• oc18--self1


    //
    //  Iphone.h
    //  day13
    
    #import <Foundation/Foundation.h>
    
    typedef enum
    {
        kFlahlightStatusOpen,
        kFlahlightStatusClose
    } FlahlightStatus;
    
    @interface Iphone : NSObject
    {
        int  _cpu;
    }
    + (void)carameWithFlahlightStatus:(FlahlightStatus)status;
    + (void)openFlahlight;
    + (void)closeFlahlight;
    @end
    //
    //  Iphone.m
    //  day13
    
    #import "Iphone.h"
    
    @implementation Iphone
    
    /*
     类方法中可以直接调用类方法
     类方法中不可以直接调用对象方法
     类方法中不能访问成员变量
    */
    
    + (void)carameWithFlahlightStatus:(FlahlightStatus)status
    {
        if (status == kFlahlightStatusOpen) {
    //        [Iphone openFlahlight];
            // 其实在类方法中调用类方法除了可以使用类名调用以外, 还可以使用self来调用
            [self openFlahlight];
        }else
        {
    //        [Iphone closeFlahlight];
            // self == Iphone
            [self closeFlahlight];
        }
        NSLog(@"拍照");
    }
    
    + (void)openFlahlight
    {
        NSLog(@"打开闪光灯");
    }
    
    + (void)closeFlahlight
    {
        NSLog(@"关闭闪光灯");
    }
    @end
    //
    //  main.m
    //  self关键字
    
    #import <Foundation/Foundation.h>
    #import "Iphone.h"
    
    int main(int argc, const char * argv[]) {
        // self不能离开类, 离开类之后没有任何意义
        [Iphone carameWithFlahlightStatus:kFlahlightStatusClose];
        return 0;
    }

    self2:

    //
    //  Iphone.h
    //  day13
    
    #import <Foundation/Foundation.h>
    
    typedef enum
    {
        kFlahlightStatusOpen,
        kFlahlightStatusClose
    } FlahlightStatus;
    
    @interface Iphone : NSObject
    {
        int  _cpu;
    }
    
    - (void)carameWithFlahlightStatus:(FlahlightStatus)status;
    - (void)openFlahlight;
    - (void)closeFlahlight;
    @end
    //
    //  Iphone.m
    //  day13
    
    #import "Iphone.h"
    
    @implementation Iphone
    
    /*
     如果self在对象方法中, 那么self就代表调用当前对象方法的那个对象
     如果self在类方法中, 那么self就代表调用当前类方法的那个类
     总结: 
     我们只用关注self在哪一个方法中 , 如果在类方法那么就代表当前类, 如果在对象方法那么就代表"当前调用该方法的对象"
     */
    - (void)carameWithFlahlightStatus:(FlahlightStatus)status
    {
        if (status == kFlahlightStatusOpen) {
            // 其实self不仅仅可以调用我们的类方法, 还可以调用对象方法
            // self == 对象 == p
            NSLog(@"self = %p", self);
            [self openFlahlight];
        }else
        {
            [self closeFlahlight];
        }
        NSLog(@"拍照");
    }
    
    - (void)openFlahlight
    {
        NSLog(@"打开闪光灯");
    }
    
    - (void)closeFlahlight
    {
        NSLog(@"关闭闪光灯");
    }
    
    @end
    //
    //  main.m
    //  self关键字2
    
    #import <Foundation/Foundation.h>
    #import "Iphone.h"
    
    int main(int argc, const char * argv[]) {
        
        Iphone *p = [Iphone new];
        NSLog(@"p = %p", p);
        [p carameWithFlahlightStatus:kFlahlightStatusOpen];
        
        return 0;
    }

    self3:

    //
    //  Iphone.h
    //  day13
    
    #import <Foundation/Foundation.h>
    
    typedef enum
    {
        kFlahlightStatusOpen,
        kFlahlightStatusClose
    } FlahlightStatus;
    
    @interface Iphone : NSObject
    {
        int  cpu;
    }
    
    - (void)setCpu:(int)cpu;
    + (void)carameWithFlahlightStatus:(FlahlightStatus)status;
    + (void)openFlahlight;
    + (void)closeFlahlight;
    @end
    //
    //  Iphone.m
    //  day13
    
    #import "Iphone.h"
    
    @implementation Iphone
    
    /*
     如果self在对象方法中, 那么self就代表调用当前对象方法的那个对象
     如果self在类方法中, 那么self就代表调用当前类方法的那个类
     总结: 
     我们只用关注self在哪一个方法中 , 如果在类方法那么就代表当前类, 如果在对象方法那么就代表"当前调用该方法的对象"
    
     注意:
     >self会自动区分类方法和对象方法, 如果在类方法中使用self调用对象方法, 那么会直接报错
     >不能在对象方法或者类方法中利用self调用当前self所在的方法
     
     使用场景:
     可以用于在对象方法之间进行相互调用
     可以用于在类方法之间进行相互调用
     
     可以用于区分成员变量和局部变量同名的情况
     */
    + (void)carameWithFlahlightStatus:(FlahlightStatus)status
    {
        if (status == kFlahlightStatusOpen) {
            NSLog(@"self = %p", self);
            [self openFlahlight]; // p
        }else
        {
            [self closeFlahlight];
        }
        NSLog(@"拍照");
    }
    
    + (void)openFlahlight
    {
        NSLog(@"打开闪光灯");
        NSLog(@"self = %p", self);
        // 死循环
        [self openFlahlight]; // p
    }
    
    + (void)closeFlahlight
    {
        NSLog(@"关闭闪光灯");
    }
    
    - (void)setCpu:(int)cpu
    {
        self->cpu = cpu;
    }
    @end
    //
    //  main.m
    //  self关键字的注意点
    
    #import <Foundation/Foundation.h>
    #import "Iphone.h"
    
    int main(int argc, const char * argv[]) {
        
        [Iphone carameWithFlahlightStatus:kFlahlightStatusOpen];
    //    Iphone *p = [Iphone new];
    //     NSLog(@"p = %p", p);
    //    [p carameWithFlahlightStatus:kFlahlightStatusOpen];
        return 0;
    }
  • 相关阅读:
    .Net连接字符串设置连接池大小显著提高数据库速度
    转载:MongoDB之旅(超赞,适合初学者)
    MongoDB安装成为Windows服务及日常使用遇到问题总结
    开启Windows文件共享必须开启的两个服务
    Cocos2d-JS中瓦片地图API
    EF-CodeFirst 继承关系TPH、TPT、TPC
    MVC5-4 ViewResult
    MVC5-3 Result分析
    MVC5-2 MVC的管道流与路由
    MVC5-1 ASP.NET的管道流
  • 原文地址:https://www.cnblogs.com/yaowen/p/7412848.html
Copyright © 2020-2023  润新知