• OC学习那些事:点语法


    1.使用自定义的方法创建get/set方法 

    Person.h文件 

     

    #import <Foundation/Foundation.h> 
    @interface Person : NSObject 
    { 
        int age; 
    } 
    -(void)setAge:(int)newAge;//方法名是setAge: 
    -(int)age;//方法名是age 
    //-(void)setAge:(int)newAge AndNo:(int)no;//方法名是setAge:AndNo: 
    @end 

    Person.m文件 

     

    #import "Person.h" 
    @implementation Person 
    -(void)setAge:(int)newAge 
    { 
        age = newAge; 
    } 
    -(int)age 
    { 
        return age; 
    } 
    @end 

    main.m文件 

     

    #import <Foundation/Foundation.h> 
    #import "Person.h" 
    int main(int argc, const char * argv[]) 
    { 
        @autoreleasepool { 
            Person *person = [[Person alloc]init]; 
            [person setAge:10]; 
            int age = [person age]; 
            NSLog(@"age is %i",age); 
            [person release]; 
        } 
        return 0; 
    } 

    2.使用点语法访问成员 

    2.1在OC中点语法不是访问成员变量,而是隐式调用get/set方法 

    • person.age = 10等效于[person setAge:10]; 

    • int age = person.age等效于[person age];  

     

    Person *person = [[Person alloc]init]; 
    //使用点语法访问成员和设置成员变量 
    person.age = 10; 
    int age = person.age; 
    NSLog(@"age is %i",age); 

    2.2通过在get/set方法中打印数据(或设置断点的方式),可以观察到方法的调用 

     

    -(void)setAge:(int)newAge 
    { 
        NSLog(@"调用了setAge方法:%i",newAge); 
        age = newAge; 
    } 
    -(int)age 
    { 
        NSLog(@"调用了age方法:%i",age); 
        return age; 
    } 

    运行代码的输出为 

    2013-07-18 23:23:59.946 点语法[2314:303] 调用了setAge方法:10 

    2013-07-18 23:23:59.967 点语法[2314:303] 调用了age方法:10 

    2013-07-18 23:23:59.968 点语法[2314:303] age is 10 

    2.3注意,OC中,为了防止self.age误认为是访问成员变量age,所有的成员变量,推荐使用_age 

     

    @interface Person : NSObject 
    { 
        int _age; 
    } 

    2.4setAge方法中和age方法中的错误写法 

     

    -(void)setAge:(int)newAge 
    { 
        NSLog(@"调用了setAge方法:%i",newAge); 
        self.age = newAge; 
    } 

    不能在setAge:方法中使用self.age = newAge,相当于在setAge:方法中调用[self setAge:newAge],出现死循环,输出 

    2013-07-18 23:33:22.277 点语法[2336:303] 调用了setAge方法:10 

    2013-07-18 23:33:22.279 点语法[2336:303] 调用了setAge方法:10 

    2013-07-18 23:33:22.280 点语法[2336:303] 调用了setAge方法:10 

    2013-07-18 23:33:22.280 点语法[2336:303] 调用了setAge方法:10 

     

    -(int)age 
    { 
        NSLog(@"调用了age方法:%i",_age); 
        return self.age; 
    } 

    不能在age方法中使用return self.age,相当于return [self age];,出现了死循环,输出 

    2013-07-18 23:36:30.506 点语法[2364:303] 调用了age方法:10 

    2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10 

    2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10 

    2013-07-18 23:36:30.507 点语法[2364:303] 调用了age方法:10 

    3.经过上面的学习,我们正规的写法应该是如下: 

    Person.h文件 

     

    #import <Foundation/Foundation.h> 
    @interface Person : NSObject 
    { 
        //1.使用_age声明成员,方式self.age访问成员变量的误解 
        int _age; 
    } 
     
    -(void)setAge:(int)newAge; 
    //2.使用age成员的名称,命名get方法 
    -(int)age; 
    @end 

    Person.m文件 

     

    #import "Person.h" 
    @implementation Person 
    -(void)setAge:(int)newAge 
    { 
        _age = newAge; 
    } 
    -(int)age 
    { 
        return _age; 
    } 
    @end 

    main.m文件 

     

    #import <Foundation/Foundation.h> 
    #import "Person.h" 
    int main(int argc, const char * argv[]) 
    { 
        @autoreleasepool { 
            Person *person = [[Person alloc]init]; 
            //3.使用self.age语法,隐式的调用get/set方法 
            self.age = 10; 
            int age = self.10; 
            NSLog(@"age is %i",age); 
            [person release]; 
        } 
        return 0; 
    } 
  • 相关阅读:
    hdu 4893 Wow! Such Sequence!(线段树)
    Leetcode Best Time to Buy and Sell Stock II
    Debian GNU Linux服务列表的获取、服务的关闭/开启、服务在启动时是否自己主动执行的生效/失效
    R语言中数据结构
    C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果
    deep learning实践经验总结
    Java编程思想第四版 *第五章 个人练习
    CEPH OBJECTSTORE API介绍
    leetcode(58)-Range Sum Query
    Android百日程序:GridView实现相冊效果
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3202989.html
Copyright © 2020-2023  润新知