OC基础--self关键字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC基础--self关键字相关的知识,希望对你有一定的参考价值。

PS:可以与C#中的this关键字区分记忆,虽然区别还是很大的。

一、self关键字必须了解的知识:

1.使用场合:只能用在方法中(对象方法\类方法 都可以),不能用在函数中

2.每次调用方法的时候,系统会自动创建self指针

3.self指正指向的是方法调用者

---注意:在类方法中,self指针一定指向的是类。

    在对象方法中,self指针一定指向的是对象。这个是OC语言的一个陷阱

    当在类方法中是调用了对象方法,那么编译器会将调用的这个对象方法当做类方法来处理

    反之,当在对象方法中调用了类方法,那么编译器会将调用的这个类方法当做对象方法来处理

注意事项中的代码示例:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface TestClass : NSObject
 4 
 5 /*
 6 - (void) objMethod1;
 7 
 8 + (void) classMethod1;
 9  */
10 
11 + (void) test;
12 
13 @end
14 
15 @implementation TestClass
16 
17 
18 + (void) test
19 {
20     NSLog(@"test-----------");
21     // 会引发死循环
22     [self test];
23 }
24 
25 /*
26  下面的self使用都不正确
27 - (void) objMethod1
28 {
29     NSLog(@"调用了objMethod1方法----对象方法");
30     // 编译器会将classMethod1当做是对象方法处理
31     [self classMethod1];
32 }
33 
34 + (void) classMethod1
35 {
36     // 编译器会将objMethod1当做是类方法处理
37     [self objMethod1];
38 }
39  */
40 
41 @end
42 
43 
44 int main()
45 {
46     [TestClass test];
47     
48     return 0;
49 }

4.self是一个特殊的指针,只在@implementation的方法中才有

5.self其实是方法中的一个内置指针,每次调用方法们都会有self这个指针

6.可以使用“self->成员变量名” 访问当前方法调用的成员变量

7.使用“ [self  方法名]; ”来调用方法(对象方法\类方法)

代码示例:

/*
 self
 1.使用场合:只能用在方法(对象方法\类方法),不能用在函数中
 2.每次调用方法的时候,系统会自动创建self指针
 3.self指针指向方法调用者
 */

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    int _wheels;
}

- (void)setWheels:(int)wheels;
- (int)wheels;

- (void)run;

@end

@implementation Car

// 所有的成员变量(不管是不是@public),都能直接在对象方法中访问

- (void) setWheels:(int)wheels
{
    _wheels = wheels;
    //或者self->_wheels = wheels;
}

- (int) wheels
{
    return self->_wheels;//或者return _wheels;
}

- (void) run
{
    // self是一个特殊的指针,只在@implementation的方法中才有
    // self其实是方法中一个内置指针,每次调用方法,都会有self这个指针
    // self指针指向方法调用者
    int _wheels = 10;
    
    // 利用self指针访问方法调用的成员变量_wheels
    NSLog(@"%i个轮子的车子飞奔起来了!", self->_wheels);
}


/*
 错误写法:self不能用在函数中
void test()
{
    self->_wheels = 10;
}
 */

@end

int main()
{
    Car *c = [Car new];
    [c setWheels:4];
    
    [c run];
    
    return 0;
}

 

 

 1 /*
 2 self
 3  1.出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数
 4  2.作用
 5  1> 使用 "self->成员变量名" 访问当前方法调用的成员变量
 6  2> 使用 "[self 方法名];" 来调用方法(对象方法\类方法)
 7  */
 8 
 9 #import <Foundation/Foundation.h>
10 
11 @interface Calculator : NSObject
12 
13 + (double)sumOfNum1:(double)num1 andNum2:(double)num2;
14 + (double)averageOfNum1:(double)num1 andNum2:(double)num2;
15 
16 @end
17 
18 @implementation Calculator
19 
20 + (double)sumOfNum1:(double)num1 andNum2:(double)num2
21 {
22     return num1 + num2;
23 }
24 
25 + (double)averageOfNum1:(double)num1 andNum2:(double)num2
26 {
27     // self 指向 方法调用者
28     // 在类方法中,self一定指向类
29     double sum = [self sumOfNum1:num1 andNum2:num2];
30     
31     return sum / 2;
32 }
33 
34 @end
35 
36 
37 int main()
38 {
39     double d = [Calculator averageOfNum1:10 andNum2:5];
40     
41     NSLog(@"d is %f", d);
42     return 0;
43 }

 

                   

以上是关于OC基础--self关键字的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-OC学习-常用功能代码片段整理

OC基础--关键字@property 和 @synthesize

oc-15-self

OC笔记一:Objective

OC基础--OC中类的声明与定义

ios开发之OC基础-类和对象