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;
}

 

posted @ 2017-08-22 17:58  无天666  阅读(206)  评论(0编辑  收藏  举报