------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
在一些其它语言中,我们可以使用“对象名.成员变量名”来访问一些公共的成员变量,这样格式的方法,我们就叫做点语法。
在OC语言中,为了让其它行业的程序员可以快速学习,也引入了点语法。
通常的set和get方法:
这种方式是代码的原始写法。
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)setAge:(int)newAge;
- (int)age;
@end
定义了一个成员变量_age,其权限是默认的@protected,所以外界不能直接访问它
从而声明了set和get方法。
Person.m
>#import "Person.h"
@implementation Person
- (void)setAge:(int)newAge {
_age = newAge;
}
- (int)age {
return _age;
}
@end
以上方法是对set和get的实现
main.m
#import "Person.h"
int main()
{
Student *stu = [[Student alloc] init];
// 设置age的值
[stu setAge:10];
// 取出age的值
int age = [stu age];
NSLog(@"age is %i", age);
[stu release];
}
return 0;
}
以上就是OC的本质方法,来实现set和get方法的调用。但是使用[]的方法,对于其他程序员来说是比较难接受的,所以OC就又引入了点语法。
使用点语法来代替set方法和get方法
int main()
{
@autoreleasepool {
Person *stu = [[Person alloc] init];
// 设置age的值
stu.age = 10; // 等价于[stu setAge:10];
// 取出age的值
int age = sut.age; // 等价于int age = [stu age];
NSLog(@"age is %i", age);
[stu release];
}
return 0;
}
以上代码是用点语法代替了传统的语法,即用stu.age=10代替原来的[stu setAge:10] ,再OC中他们是可以相互替换的。
但是stu.age=10不代表可以直接访问age,它只是一个转化,stu.age=10还是会转化为[stu.setage:10]。
值得注意stu.age=10不能直接访问对象,他们还是@protected格式,不和stu->age一样。
使用stu.age是来替换[stu age]的,这两种写法也是可以相互替换的。
stu.age也不能直接访问对象的成员变量,而是将int age = stu.age自动展开成int age = [stu age]
虽然set和get方法的点语法很相似,但程序员也可以根据自己是取值还是输入值来区别。
如果想快速区分,也可以用以下代码
#import "Person.h"
@implementation Person
- (void)setAge:(int)newAge
{
printf("这个是set方法");
_age = newAge;
}
- (int)age
{
printf("这个是get方法");
return _age;
}
@end
在set和get方法的实现里面加上一些打印功能可以让我们更直观区别。
在我们使用点语法时,要注意:
#import "Person.h"
@implementation Person
- (void)setAge:(int)age
{
//_age = age;
NSLog(@"setAge:");
// 会引发死循环
self.age = age; // [self setAge:age];
}
- (int)age
{
NSLog(@"age");
return _age;
// 会引发死循环
return self.age;// [self age];
}
@end
要注意在使用self时会使代码出现死循环。
这样会使程序发生闪退,即程序奔溃。