zoukankan      html  css  js  c++  java
  • OC基础--self关键字&super关键字

    PS:OC中的self关键字可以与C#中的this关键字区分记忆,虽然区别还是很大的。  OC中的super关键字指的是父类指针

    一、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 }

     二、super关键字

    1.super可以用来调用父类的方法

    2.如果super用在对象方法中,那么就是调用父类的对象方法

    如果super用在类方法中,那么就是调用父类的类方法

                       

  • 相关阅读:
    http://www.oschina.net/translate/elasticsearch-getting-started?cmp
    http://www.mxchip.com/talk/news/jishuwenzhang/2014-09-11/67.html
    深入理解JVM—性能监控工具
    Windows7查看本地Java安装是否成功和路径的方法
    Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案
    PSYoungGen /PSOldGen/PSPermGen区别
    深入浅出Java并发包—锁机制(三)
    深入浅出Java并发包—锁机制(二)
    【转】Spring 注解学习手札(超好的springmvc注解教程)
    解决java.lang.NoClassDefFoundError: org.jdom.Content
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5166395.html
Copyright © 2011-2022 走看看