Object-c中的点语法
2015-07-08 21:54
645 查看
最近在学oc,感觉oc中的点语法挺特别的,今天特意写一下关于点语法的一些注意事项。
oc开始是没有点语法的,后来将点语法加了进来,我想可能是帮助一些熟悉其他语言的人转入oc中来。如果学过c/c++、java等语言,我们估计都不陌生,但是,实际上oc中的点语法跟刚刚所提到的一些语言是有很大区别的。废话不多说,我们依旧写一个例子加以说明。
源文件 Person.h
源文件 Person.m
源文件 main.m
我们首先声明一个Person类,在该类中,我们只声明了一个name字段,接着将对该字段的操作补充完整,也就是getter与setter的实现。这里需要注意一下,oc中默认的getter的名字与字段名字是一样的,所以getter也就是 -(NSSring *) name; 这样我们都知道其实不好,一会再说解决方法。
在主函数中我们创建一个该类的对象,通常我们设置字段内容的时候,我们通过[person setName:@”小李”]; 来进行操作的,这是oc的经典的操作。除了这种方案,我们是否还有其他方案来设置字段的值呢?答案是肯定的,也就是我们今天提到的点操作。
这里的点不像c/c++中的点,它不是直接操作对象中的字段的。这里的点是在编译层面上的,也就是说,在编译期间,编译器会将这个点转换成一般方法调用(经典方法的调用)。如下:
点操作方便了我们去操作类中的字段,oc中也添加了一些固定的形式来代替我们去写setter与getter。在声明的时候,我们可以使用@property 字段类别 字段名; 来代替getter/setter方法。如下:
在实现的时候我们可以使用@synthesize 字段名; 来代替getter/setter内容的实现,如下:
这样我们就可以通过点操作直接去操作我们的字段了。可以看出来,oc中的点操作实际上是在使用对象中的方法,而不是像c/c++中的选择作用。这里使用的两个关键字是标准的getter/setter ,如果我们需要扩展他们,就需要我们自己去实现了。
之前提出了一个问题,就是字段名与getter名重名问题,如下:
显然我们很不习惯这样命名,为了解决名字一致问题,我们可以这样来设置:
我们在声明字段时通过以下滑线开头来标识字段与getter名字的不同,这样就解决了字段名与getter名一致的问题了,是不是看着很清爽呢?好了,今天就到这吧!
以下是本程序运行的结果:
oc开始是没有点语法的,后来将点语法加了进来,我想可能是帮助一些熟悉其他语言的人转入oc中来。如果学过c/c++、java等语言,我们估计都不陌生,但是,实际上oc中的点语法跟刚刚所提到的一些语言是有很大区别的。废话不多说,我们依旧写一个例子加以说明。
源文件 Person.h
// // Person.h // Lesson5 // // Created by Lee on 7/9/15. // Copyright (c) 2015 Lee. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *_name; } -(void) setName:(NSString*)newName; -(NSString*) name; //@property NSString *name; @end
源文件 Person.m
// // Person.m // Lesson5 // // Created by Lee on 7/9/15. // Copyright (c) 2015 Lee. All rights reserved. // #import "Person.h" @implementation Person -(void) setName:(NSString*)newName{ _name = newName; } -(NSString*) name{ return _name; } //@synthesize name; @end
源文件 main.m
// // main.m // Lesson5 // // Created by Lee on 7/9/15. // Copyright (c) 2015 Lee. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); Person *person = [Person alloc]; [person setName:@"小李"]; NSLog(@"Name is %@ ",[person name]); //利用点操作字段 person.name = @"小张"; NSString *newName = person.name; NSLog(@"Name is %@ ",newName); } return 0; }
我们首先声明一个Person类,在该类中,我们只声明了一个name字段,接着将对该字段的操作补充完整,也就是getter与setter的实现。这里需要注意一下,oc中默认的getter的名字与字段名字是一样的,所以getter也就是 -(NSSring *) name; 这样我们都知道其实不好,一会再说解决方法。
在主函数中我们创建一个该类的对象,通常我们设置字段内容的时候,我们通过[person setName:@”小李”]; 来进行操作的,这是oc的经典的操作。除了这种方案,我们是否还有其他方案来设置字段的值呢?答案是肯定的,也就是我们今天提到的点操作。
这里的点不像c/c++中的点,它不是直接操作对象中的字段的。这里的点是在编译层面上的,也就是说,在编译期间,编译器会将这个点转换成一般方法调用(经典方法的调用)。如下:
person.name=@"小李"; //点操作在编译期间实质转换成的经典的形式 [person setName:@"小李"]; NSString *name = person.name; //点操作在编译期间实质转换成的经典的形式 NSString *name = [person name];
点操作方便了我们去操作类中的字段,oc中也添加了一些固定的形式来代替我们去写setter与getter。在声明的时候,我们可以使用@property 字段类别 字段名; 来代替getter/setter方法。如下:
//-(void) setName:(NSString*)newName; //-(NSString*) name; @property NSString *name; //以上注释等同于这句
在实现的时候我们可以使用@synthesize 字段名; 来代替getter/setter内容的实现,如下:
@implementation Person //-(void) setName:(NSString*)newName{ // name = newName; //} // //-(NSString*) name{ // return name; //} // @synthesize name; //以上注释内容等同于这句 @end
这样我们就可以通过点操作直接去操作我们的字段了。可以看出来,oc中的点操作实际上是在使用对象中的方法,而不是像c/c++中的选择作用。这里使用的两个关键字是标准的getter/setter ,如果我们需要扩展他们,就需要我们自己去实现了。
之前提出了一个问题,就是字段名与getter名重名问题,如下:
-(NSString*) name{ return name; }
显然我们很不习惯这样命名,为了解决名字一致问题,我们可以这样来设置:
#import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *_name; //通过以下划线来解决getter名与字段名重复问题 } -(void) setName:(NSString*)newName; -(NSString*) name; //@property NSString *name; @end @implementation Person -(void) setName:(NSString*)newName{ _name = newName; } -(NSString*) name{ return _name; } //@synthesize name; @end
我们在声明字段时通过以下滑线开头来标识字段与getter名字的不同,这样就解决了字段名与getter名一致的问题了,是不是看着很清爽呢?好了,今天就到这吧!
以下是本程序运行的结果:
相关文章推荐
- Objective-C中的Block
- Objective-C字符串处理
- 转自子龙山人:Objective-c的@property 详解
- 欢迎使用CSDN-markdown编辑器
- Critical Section Object
- Object.prototype.toString & typeof
- Objective-C 枚举类型和字符串互转方案
- OC-继承-初始化方法-便利构造器(练习题-打僵尸)
- [Objective-C] send message 和 call method 的区别
- Three Sources of a Solid Object-Oriented Design
- Objective-C Runtime中的并发内存分配
- Objective-C Runtime
- Objective-C Runtime
- Objective-C Runtime
- Objective-C Associated Objects 的实现原理
- 论文提要“You Only Look Once: Unified, Real-Time Object Detection”
- java中object常用方法
- [Objective-C] 目标文件反编译得到Objecitve-C源文件
- JSONObject基本内容(三)
- Objective-C之定义函数