IOS开发基础Object-C(03)—点语法
2015-10-31 17:27
555 查看
今天我们来介绍一下OC中的点语法,官方为了让更多的程序员更加容易的学习开发OC语言,所以增加了一个点语法。在上一篇博客中,我们详细介绍了在OC中类的创建。今天我们就来简单的复习一下:
2.在Student.m文件中实现
3.main.m文件中调用
1.调用set方法
2.调用get方法
有人就会有疑问了,stu.age到底调用的是对象还是方法?如果是方法的话那是get方法还是set方法?
这就是OC中点语法和Java中点语法不同的地方了。
3.在Java中,
指的是给Student中的age对象赋值为10.
4.在OC中,stu.age 就是调用的get或set方法了。至于调用的是set方法还是get方法,取决于它是取值还是赋值。也就是说,如果他在等号左边,那就是调用set方法,如果是在等号右边,那就是调用get方法。
用点语法重新写上边的程序就是
把原来的int age = [stu age]替换成了int age = stu.age。这两种写法又是完全等价的,stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]
5.如果你想验证点语法是不是方法调用的话,有很多方法。比如你可以在Student.m的set方法和get方法内部用NSLog加一些打印信息,如果程序运行后有输出打印信息,说明的确是调用了get方法或者set方法
2.OC中有个self关键字,作用跟this关键字类似。我这么说完,可能有人就会想这样写OC的set方法了:
3.第2行中的self代表着当前调用setAge:方法的对象。但是第2行代码是绝对错误的,会造成死循环。因为我在前面已经说过了,OC点语法的本质是方法调用,所以上面的代码相当于:
很明显,会造成死循环,无限调用setAge:方法,程序就这样崩溃了
2.为什么约定俗称成员变量约定俗成使用_age?
代码:
一、创建一个学生类
1.在Student.h文件中声明#import< Fountation/Fountation.h> @interface Student :NSObject{ int _age;//约定俗成的成员变量以下划线开头,_age } -(int)age;//get 方法 -(void)setAge:(int)age;//set方法 @end
2.在Student.m文件中实现
#import"Student.h"//导入头文件 @implementation Student //实现一个类 -(void)setAge:(int)age{ _age=age; //_age是成员变量 } -(int)age{ return _age; } @end
3.main.m文件中调用
#import< Fountation/Fountation.h> #import"Student.h" int main(int argc,const char *argv[]) { @autoreleasepool{ Student *stu=[[Student alloc] init];//创建对象 [stu setAge:10]; //调用set方法 int age=[stu age]; //调用get方法 NSLog(@"Age is %i",age); [stu release];//释放对象 } return 0; }
二、点语法描述
到这里,我们的一个类就创建好了,下面我们就开始讲点语法。1.调用set方法
stu.age=10;
2.调用get方法
int age=stu.age;
有人就会有疑问了,stu.age到底调用的是对象还是方法?如果是方法的话那是get方法还是set方法?
这就是OC中点语法和Java中点语法不同的地方了。
3.在Java中,
Student stu=new Student(); stu.age=10;
指的是给Student中的age对象赋值为10.
4.在OC中,stu.age 就是调用的get或set方法了。至于调用的是set方法还是get方法,取决于它是取值还是赋值。也就是说,如果他在等号左边,那就是调用set方法,如果是在等号右边,那就是调用get方法。
用点语法重新写上边的程序就是
#import< Fountation/Fountation.h> #import"Student.h" int main(int argc,const char *argv[]) { @autoreleasepool{ Student *stu=[[Student alloc] init];//创建对象 stu.age=10;//调用set方法,等价于[stu setAge:10]; int age=stu.age;//调用get方法,等价于int age=[stu age]; NSLog(@"Age is %i",age); [stu release];//释放对象 } return 0; }
把原来的int age = [stu age]替换成了int age = stu.age。这两种写法又是完全等价的,stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]
5.如果你想验证点语法是不是方法调用的话,有很多方法。比如你可以在Student.m的set方法和get方法内部用NSLog加一些打印信息,如果程序运行后有输出打印信息,说明的确是调用了get方法或者set方法
#import"Student.h"//导入头文件 @implementation Student //实现一个类 -(void)setAge:(int)age{ _age=age; //_age是成员变量 NSLog(@"调用了set方法"); } -(int)age{ NSLog(@"调用了get方法"); return _age; } @end
三、self和点语法
1.在Java中,this关键字代表着方法调用者,也就是说,谁调用了这个方法,this就代表谁。所以一般会这样写set方法:public void setAge(int newAge) { this.age = newAge;//将newAge参数的值,赋值给方法调用者的成员变量age }
2.OC中有个self关键字,作用跟this关键字类似。我这么说完,可能有人就会想这样写OC的set方法了:
- (void)setAge:(int)newAge { self.age = newAge; }
3.第2行中的self代表着当前调用setAge:方法的对象。但是第2行代码是绝对错误的,会造成死循环。因为我在前面已经说过了,OC点语法的本质是方法调用,所以上面的代码相当于:
- (void)setAge:(int)newAge { [self setAge:newAge]; }
很明显,会造成死循环,无限调用setAge:方法,程序就这样崩溃了
四、留在最后的思考
1.在以下代码中,set方法和get方法的方法名是什么?2.为什么约定俗称成员变量约定俗成使用_age?
代码:
#import< Fountation/Fountation.h> @interface Student :NSObject{ int _age;//约定俗成的成员变量以下划线开头,_age } -(int)age;//get 方法 -(void)setAge:(int)age;//set方法 -(void)setAge:(int)age andNo:(int)no; @end
相关文章推荐
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- Mootools 1.2教程 类(一)
- C#托管堆对象实例包含内容分析
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS教程:对象-正则表达式(RegExp)对象
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- C#编程自学之类和对象
- C++中对象的常引用、动态建立和释放相关知识讲解
- php中将一个对象保存到Session中的方法
- php对象和数组相互转换的方法
- PHP中把对象转换为关联数组代码分享
- C#写入对象或集合类型数据到xml文件的方法
- C#利用反射来判断对象是否包含某个属性的实现方法
- ASP.NET中使用Application对象实现简单在线人数统计功能
- asp提示Server 对象 错误 ASP 0178 : 80070005
- Javascript 对象的解释