只用關注self在哪一個方法中 , 如果在類方法那么就代表當前類, 如果在對象方法那么就代表"當前調用該方法的對象"
注意:
self會自動區分類方法和對象方法, 如果在類方法中使用self調用對象方法, 那么會直接報錯
不能在對象方法或者類方法中利用self調用當前self所在的方法
使用場景:
可以用于在對象方法之間進行相互調用
可以用于在類方法之間進行相互調用
可以用于區分成員變量和局部變量同名的情況
- (void)setCpu:(int)cpu
{
self->cpu = cpu;
}
Iphone.m
#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
Iphone.m
#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