黑马程序员-OC-点语法

来源:互联网 发布:java获取当年的第一天 编辑:程序博客网 时间:2024/05/02 00:49

------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时会使代码出现死循环。

这样会使程序发生闪退,即程序奔溃。



0 0
原创粉丝点击