pragma mark 项目1:self关键字基本概念(类方法使用场景)
pragma mark 概念
/**
如果self在 对象方法中, 那么self就是 代表 调用当前对象方法 的 那个对象
如果self在 类方法中, 那么 self 就 代表 调用当前类方法 的那个类
总结:
我们只要关注 self 在那一个方法中,
如果在 类方法 那么就代表当前 类,
如果在 对象方法 那么就 代表 "当前 调用该方法的 对象"
*/
#pragma mark 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Iphone.h"
#pragma mark main函数
int main(int argc, const char * argv[])
{
#warning self 不能离开类, 离开类之后没有任何意义
[Iphone carameWithFlahLightStatus:FlahLightStatusOpen];
return 0;
}
Iphone.h // 手机类
#import <Foundation/Foundation.h>
// 是否打开闪光灯
typedef enum
{
FlahLightStatusOpen,
kFlahLightStatusClose
}kFlahLightStatus;
@interface Iphone : NSObject
{
int _cpu;
}
/**
* 根据闪光灯的状态拍照
*
* @param status 闪光灯的状态 (开、关)
*/
// 没有使用到成员变量 不需要使用对象方法
// 使用类方法
+ (void)carameWithFlahLightStatus:(kFlahLightStatus)status;
/**
* 打开闪关灯
*/
+ (void)openFlahLight;
+ (void)closeFlahLight;
@end
Iphone.m
#import "Iphone.h"
@implementation Iphone
// 没有使用到成员变量 不需要使用对象方法
/**
类方法中 可以 直接调用 类方法
类方法中 不可以 直接调用 类方法
类方法中 不能访问成员变量
*/
+ (void)carameWithFlahLightStatus:(kFlahLightStatus)status
{
if (status == FlahLightStatusOpen)
{
// 使用类名 调用
// [Iphone openFlahLight];
// 其实 在类方法中 调用类方法 除了可以使用类名 调用以外, 还可以使用self来调用
// self == 类名
[self openFlahLight]; // 控制台输出的self就是 Iphone类
}
else
{
// 使用类名 调用
// [Iphone closeFlahLight];
[self closeFlahLight];
}
NSLog(@"拍照");
}
+ (void)openFlahLight
{
NSLog(@"打开闪关灯");
}
+ (void)closeFlahLight
{
NSLog(@"关闭闪关灯");
}
@end
pragma mark 项目2:self 关键字2 (对象方法使用场景)
pragma mark 概念
#pragma mark 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Iphone.h"
#pragma mark main函数
int main(int argc, const char * argv[])
{
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;
}
/**
* 根据闪光灯的状态拍照
*
* @param status 闪光灯的状态 (开、关)
*/
// 没有使用到成员变量 不需要使用对象方法
// 使用类方法
- (void)carameWithFlahLightStatus:(kFlahLightStatus)status;
/**
* 打开闪关灯
*/
- (void)openFlahLight;
- (void)closeFlahLight;
@end
Iphone.m
#import "Iphone.h"
@implementation Iphone
/**
如果self在 对象方法中, 那么self就是 代表 调用当前对象方法 的 那个对象
如果self在 类方法中, 那么 self 就 代表 调用当前类方法 的那个类
总结:
我们只要关注 self 在那一个方法中,
如果在 类方法 那么就代表当前 类,
如果在 对象方法 那么就 代表 "当前 调用该方法的 对象"
*/
- (void)carameWithFlahLightStatus:(kFlahLightStatus)status
{
if (status == FlahLightStatusOpen)
{
NSLog(@"self = %p",self);
// 其实self 不仅仅可以调用 我们的类方法, 还可以调用对象方法
// self == 对象 == p
[self openFlahLight]; // 控制台输出的self 是一个指针 就是 Iphone类的对象
}
else
{
[self closeFlahLight];
}
NSLog(@"拍照");
}
- (void)openFlahLight
{
NSLog(@"打开闪关灯");
}
- (void)closeFlahLight
{
NSLog(@"关闭闪关灯");
}
@end