Objective - C基础: 第二天 - 6.关键字self的基本认识

在前面我们知道了实例方法, 类方法, set方法, get方法, 现在我们来讲一个和OC普通关键字(因为OC的关键字都带"@"符号)不一样的self, 那什么是self呢??? 下面让我们一起来看看~~


先看一个例子:

#import <Foundation/Foundation.h>

@interface Preson : NSObject
{
    int _age;
}
- (void)setAge:(int)age;
- (int)age;

- (void)test;
@end

@implementation Preson
- (void)setAge:(int)age
{
    _age = age;
}
- (int)age
{
    return _age;
}

- (void)test
{
    NSLog(@"有一个%d岁在人在等车", _age);
}
@end

int main()
{
    Preson *p = [Preson new];
    
    [p setAge:20];
    
    [p test];
    
    return 0;
}

输出的结果我们都知道:

Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
Cain:2.第二天 Cain$ ./a.out 
2015-01-17 21:39:35.977 a.out[15770:1718617] 有一个20岁在人在等车


那如果改一下test方法呢???

- (void)test
{
    int _age = 30;
    NSLog(@"有一个%d岁在人在等车", _age);
}

输出的结果:

Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
07-self.m:26:45: warning: local declaration of '_age' hides instance variable [-Wshadow-ivar]
    NSLog(@"有一个%d岁在人在等车", _age);
                                   ^
1 warning generated.
Cain:2.第二天 Cain$ ./a.out 
2015-01-17 21:47:24.067 a.out[15783:1720419] 有一个30岁在人在等车


虽然有警告, 但并不影响我们运行, 为什么会有这样子的结果呢? 不是设定的值是20么~~


其实这个和我们之前在C语言里面学过的一样, 就近原则, 一旦在比较近的同名实例变量, 就只会找最近的, 只有在里面没有同名的实例变量, 才会出去找.




那如果我只想访问main()函数里面的那个值, 不想要就近原则呢? 解决办法是有的, 让我们来看看~~

1. 使用第三方变量

- (void)test
{
    int newAge = _age;
    int _age = 30;
    NSLog(@"有一个%d岁在人在等车", newAge);
}

在修改之前把原来的值取出来, 赋给另外一个变量, 再打印出来, 结果就和我们想的一样:

Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
Cain:2.第二天 Cain$ ./a.out 
2015-01-17 21:51:02.652 a.out[15792:1721365] 有一个20岁在人在等车



2. 使用self关键字

- (void)test
{
    int _age = 30;
    NSLog(@"有一个%d岁在人在等车", self->_age);
}

输出的结果也和我们想要的是一致:

Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation
Cain:2.第二天 Cain$ ./a.out 
2015-01-17 21:52:54.949 a.out[15799:1722160] 有一个20岁在人在等车




那么self到底是什么呢? 


其实self是一个指针, 那么这个指针指的是谁呢? 在main()函数里, 谁调用, 那么self就指谁, 在我们这个例子里, 是p在调用test方法, 那么self就是指向p啦~~所以打印出来的结果和我们想要的是一致.




那么self除了这样子用, 还有没有其他用途呢? 其实是有的, 比如:

#import <Foundation/Foundation.h>

@interface Preson : NSObject
- (void)eat;
- (void)run;
@end

@implementation Preson
- (void)eat
{
    NSLog(@"一个人在吃东西.");
}
- (void)run
{
    NSLog(@"一个人在跑步.");
}
@end

int main()
{
    Preson *p = [Preson new];
    
    [p eat];
    [p run];
    
    return 0;
}

在之前, 我们如果要调用两个方法, 就必须这样子去调用, 但现在我们学了self, 那么就可以很省事了~~

#import <Foundation/Foundation.h>

@interface Preson : NSObject
- (void)eat;
- (void)run;
@end

@implementation Preson
- (void)eat
{
    NSLog(@"一个人在吃东西.");
}
- (void)run
{
    [self eat];
    NSLog(@"一个人在跑步.");
}
@end

int main()
{
    Preson *p = [Preson new];
    
    [p run];
    
    return 0;
}

输出的结果:

Cain:2.第二天 Cain$ cc 08-self.m -framework Foundation
Cain:2.第二天 Cain$ ./a.out 
2015-01-17 22:37:55.563 a.out[15910:1731906] 一个人在吃东西.
2015-01-17 22:37:55.565 a.out[15910:1731906] 一个人在跑步.

非常的简单, 我们就可以省略很多事情, 直接调用一个方法就可以了~~~





好了, 这次我们就讲到这里, 下次我们继续~~~

posted @ 2015-01-17 21:36  背着吉他去流浪  阅读(154)  评论(0编辑  收藏  举报