pragma mark self注意点和应用场景
pragma mark 概念
/**
如果self在 对象方法中, 那么self就是 代表 调用当前对象方法 的 那个对象
如果self在 类方法中, 那么 self 就 代表 调用当前类方法 的那个类
总结:
我们只要关注 self 在那一个方法中,
如果在 类方法 那么就代表当前 类,
如果在 对象方法 那么就 代表 "当前 调用该方法的 对象"
注意:
> self会自定区分 类方法 和 对象方法, 如果在类方法中 使用self调用对象方法, 那么会直接报错
> 不能在 对象方法 或者 类方法中利用 self 调用当前的self 所在的方法(查看#warning 死循环)
#warning self的使用场景
可以用于 在对象方法之间 进行相互调用
可以用于 在类方法之间 进行相互调用
可以用于区分 成员变量 和 局部变量
*/
pragma mark 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Iphone.h"
#pragma mark main函数
int main(int argc, const char * argv[])
{
[Iphone carameWithFlahLightStatus:FlahLightStatusOpen];
// Iphone *p = [Iphone new];
// NSLog(@"外面的p = %p",p);
// [p carameWithFlahLightStatus:FlahLightStatusOpen];
return 0;
}
Iphone.h // 手机类
#import <Foundation/Foundation.h>
// 是否打开闪光灯
typedef enum
{
FlahLightStatusOpen,
kFlahLightStatusClose
}kFlahLightStatus;
@interface Iphone : NSObject
{
// int _cpu;
int cpu; // 可以利用self 来区分局部变量和全局变量
}
#pragma mark set get
- (void)setCpu:(int)cpu;
- (int)cpu;
#pragma mark 方法
/**
* 根据闪光灯的状态拍照
*
* @param status 闪光灯的状态 (开、关)
*/
// 没有使用到成员变量 不需要使用对象方法
// 使用类方法
+ (void)carameWithFlahLightStatus:(kFlahLightStatus)status;
/**
* 打开闪关灯
*/
+ (void)openFlahLight;
+ (void)closeFlahLight;
@end
Iphone.m
#import "Iphone.h"
@implementation Iphone
/**
如果self在 对象方法中, 那么self就是 代表 调用当前对象方法 的 那个对象
如果self在 类方法中, 那么 self 就 代表 调用当前类方法 的那个类
总结:
我们只要关注 self 在那一个方法中,
如果在 类方法 那么就代表当前 类,
如果在 对象方法 那么就 代表 "当前 调用该方法的 对象"
注意:
> self会自定区分 类方法 和 对象方法, 如果在类方法中 使用self调用对象方法, 那么会直接报错
> 不能在 对象方法 或者 类方法中利用 self 调用当前的self 所在的方法(查看#warning 死循环)
#warning self的使用场景
可以用于 在对象方法之间 进行相互调用
可以用于 在类方法之间 进行相互调用
可以用于区分 成员变量 和 局部变量
*/
- (void)setCpu:(int)cpu
{
/*
self->cpu 是 全局变量 在外面.h中{} 定义的变量
cpu 是局部变量 通过外界 调用setCpu:(int)cpu 方法 传递一个cpu进来的变量
*/
self->cpu = cpu;
}
- (int)cpu
{
return self->cpu;
}
#pragma mark 方法
+ (void)carameWithFlahLightStatus:(kFlahLightStatus)status
{
if (status == FlahLightStatusOpen)
{
[self openFlahLight]; // self 代表外面的 p
}
else
{
[self closeFlahLight];
}
NSLog(@"拍照");
}
+ (void)openFlahLight
{
NSLog(@"打开闪关灯");
NSLog(@"里面的self = %p",self);
#warning 死循环
[self openFlahLight]; // self 代表外面的 p
}
+ (void)closeFlahLight
{
NSLog(@"关闭闪关灯");
}
@end