我以为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并不是其成员变量名,实际上应是方法名。