对Objective C语言的吐槽

我以为Oc继承了C。那么在很多方面与C就非常相像了。
特别是所谓的点语法。
在C语言中间,与Class类似的当然是结构体了。
在C语言,点号

结构体变量.成员名
(*p).成员名
以及
p->成员名

既然class与结构体相似,那么在Oc中间,
(*p).name也应该是合理的。结果我试了一下,报错了.
我在使用过程中并且查阅了资料才发现。OC中的点语法竟然只是为了照顾C++与JAVA程序员。而并不是继承了C语言的语法。

如果类实现了get与set方法,那么就可以对成员变量使用点语法,比如,如下:

#import <Foundation/Foundation.h>


@interface Person :NSObject
{  @public
    int age;
    NSString * name;
}

-(void)  sayHi;
-(void) setAge:(int)age;
-(int)age;
@end

@implementation Person


-(void)sayHi{
    NSLog(@"im  jerry %d",age);
}
-(int)age{
    
    return  age;
}
-(void) setAge:(int)age{
    self->age=age;
}

@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        Person* p=[Person new];
        
        p.age=10;
        p.sayHi;
      
    }
    return 0;
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        Person* p=[Person new];
        
        p.age=10;
        p->age=15; //等价于[p setAge:15];没有set方法将会报错。
        NSLog(@"age:%d",p.age);[p age]; //没有get方法将会报错。
        p.sayHi;
    }
    return 0;
}

原来,OC中的点语法只是为了照顾C和JAVA程序员而已。它既不等于C语言中结构体的点号语法,也不等于JAVA的点号语法。

实际上, p.age=10;虽然简化了代码,但是却非常难以让人理解。这样的点语法实在是奇葩。
p是一个地址变量,如果要访问对象的变量,应该是(*p).age才对。
作为一个java程序员和C程序员,真是被OC的语法给搞晕了。
http://blog.csdn.net/jiangwei0910410003/article/details/41683873
p.age=10; //等价于[p setAge:15];没有set方法将会报错。
实际上是对方法的调用。
age会处理成”setAge”。
age并不是其成员变量名,实际上应是方法名。

    原文作者:happyfish
    原文地址: https://segmentfault.com/a/1190000003482909
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞