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; 
} 
原文地址:https://www.cnblogs.com/javawebsoa/p/3202989.html