OC中的点运算

传统的OC编程语言是将运算式放在方括号里面,类似[Dog wangWang]这样的结构。

为了迎合从其他语言和编程习惯的大神来到OC世界,同时也为了优化复杂的运算机制,OC引入了点运算这个概念。

下面通过实例来说明一下点运算是如何完成运算的。

首先定义了如下的Dog类。并声明和实现它的setter和getter方法。

#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
    @private
    int age;
}
- (void) setAge:(int)newAge;
- (int) age;
@end
#import "Dog.h"
@implementation Dog
- (void) setAge:(int)newAge {
    age = newAge;
}
- (int) age {
    return age;
}
@end
在main函数中可以引入头文件,并创建Dog对象,然后对该对象age赋值。

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Dog *dog1 = [[Dog alloc] init];
        [dog1 setAge:20];
        
        int dogAge = [dog1 age];
        printf("Dog1's age is %d\n", dogAge);
    }
    return 0;
}
打印结果如下:

Dog1's age is 20
以上是传统的声明和赋值方法。

下面通过点运算做同样的工作。main函数加入点运算代码,结果如下:

#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Dog *dog1 = [[Dog alloc] init];
        [dog1 setAge:20];
        
        int dogAge = [dog1 age];
        printf("Dog1's age is %d\n", dogAge);
        
        dog1.age = 30;
        dogAge = dog1.age;
        printf("Dog1's new age is %d\n", dogAge);
        
    }
    return 0;
}
打印结果如下:
Dog1's age is 20
Dog1's new age is 30
通过以上代码可以发现,dog1.age的点运算实现了对dog1对象的赋值和取值操作。

这里dog1.age并不是直接调用Dog中的age成员变量,而是通过调用它的getter和setter方法来实现的读取和赋值。

点语法是编译器级别的语法。

编译器会在编译阶段把dog1.age = 30;展开成[dog1 setAge:30]; 同样会吧dogAge = dog1.age;展开成dogAge = [dog1 age];

所以实际上还是执行了中括号的传统语句。

那么编译器是怎么转换的呢?

OC语言中,setter函数和getter函数是有一定规范的,比如变量age的setter函数只能写成setAge,getter函数只能写成age。

所以编译器实质上执行的是无脑转换....当发现点函数出现在等号左边,就按格式转换成setter,点函数出现在右边,就按格式转换成getter。


------------------------------


介绍两个属性,可以简化我们编写getter和setter函数。

@property 和 @synthesize 

@property属性定义在.h文件中,通过这个属性编译阶段可以自动生成setter和getter函数。

@synthesize属性定义在.m文件中,通过这个属性编译阶段可以自动实现setter和getter函数。

所以引入这两个属性,之前的代码就可以简化为:

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
    @private
    int age;
}

@property int age;

@end
#import "Dog.h"

@implementation Dog

@synthesize age;

@end

main函数不变,执行成功,执行结果不变。

有时候有人会觉得这个getter函数和变量名一样,搞得点这个函数就像是在点变量一样,看着不方便。

下面介绍一个方法可以有效改善这个问题。

就是定义成员变量的时候,在变量前面添加一个下划线符号,然后对@synthesize属性稍作修改即可。修改后的代码如下:

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
    @private
    int _age;
}

@property int age;

@end
#import "Dog.h"

@implementation Dog

@synthesize age = _age;

@end

以上就是本次关于点运算的笔记整理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值