前言

在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"点语法"。比如:

1.在Student类的第2行定义了一个公共的成员变量age

1 public class Student {
2     public int age; 3 }

2.然后在第5行通过点语法直接给stu的成员变量age赋值

1 public class Test {
2
3 public static void main(String[] args) { 4 Student stu = new Student(); 5 stu.age = 10; 6  } 7 8 }

当然,正规的做法是让成员变量私有化,让外界使用公共的get方法和set方法访问成员变量。

3.很多高级语言中都有这种点语法,为了让其他行业的程序员快速上手OC,OC中也引入了点语法,只不过它的含义跟Java不太一样

一、传统的get方法和set方法

在正式学习OC的点语法之前,先来看一下传统的get方法和set方法。定义一个Student类,拥有一个成员变量age和对应的get\set方法。

1.Student.h

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Student : NSObject {  4 int age;  5 }  6  7 - (void)setAge:(int)newAge;  8 - (int)age;  9 10 @end

1> 在第4行定义了一个成员变量age,是@protected权限的,所以外界不能直接访问它

2> 在第7、8行分别声明了age变量的set方法和get方法

2.Student.m

 1 #import "Student.h"
 2  3 @implementation Student  4  5 - (void)setAge:(int)newAge {  6 age = newAge;  7 }  8  9 - (int)age { 10 return age; 11 } 12 13 @end

1> 在第5行实现了set方法

2> 在第9行实现了get方法

3.main.m

把定义好的Student类放到main函数中使用

 1 #import <Foundation/Foundation.h>
 2 #import "Student.h"  3  4 int main(int argc, const char * argv[])  5 {  6  @autoreleasepool {  7 Student *stu = [[Student alloc] init];  8  9 // 设置age的值 10 [stu setAge:10]; 11 12 // 取出age的值 13 int age = [stu age]; 14 15 NSLog(@"age is %i", age); 16 17  [stu release]; 18  } 19 return 0; 20 }

1> 在2行包含Student的头文件

2> 在第7行创建Student对象,在第17行释放Student对象

3> 在第10行调用set方法设置age的值

4> 在第13行调用get方法获取age的值

5> 在第15行输出age的值,输出结果如下:

2013-04-08 00:26:19.002 点语法[6164:303] age is 10

这就是OC传统的get方法和set方法的简单使用,对初学者来说,这个语法比较奇怪,因为它的方法调用是用方括号[ ]完成的。因此,OC最终引入了点语法。

二、使用点语法代替传统的get方法和set方法

上面演示了OC传统get\set方法的简单用法,接下来使用点语法来代替。

前面main.m中main函数的代码可以改为:

 1 int main(int argc, const char * argv[])  2 {  3  @autoreleasepool {  4 Student *stu = [[Student alloc] init];  5  6 // 设置age的值  7 stu.age = 10; // 等价于[stu setAge:10];  8  9 // 取出age的值 10 int age = stu.age; // 等价于int age = [stu age]; 11 12 NSLog(@"age is %i", age); 13 14  [stu release]; 15  } 16 return 0; 17 }

1.注意第7行代码,把原来的[stu setAge:10]替换成了stu.age = 10。听清楚了,这两种写法是完全等价的。即这里的stu.age并不是代表直接访问stu对象的成员变量age,而是编译器遇到stu.age = 10的时候会自动将代码展开成[stu setAge:10]

再说,如果是直接访问成员变量的话,OC中应该是这样的语法:stu->age,而不是stu.age。

2.注意第10行代码,把原来的int age = [stu age]替换成了int age = stu.age。这两种写法又是完全等价的,stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]

3.因此,OC中点语法的含义跟Java是完全不一样的,OC点语法的本质是方法调用,不是直接访问成员变量。至于这个点语法代表的是get方法还是set方法,那就取决于你是取值还是设值,取值就是get方法(如第10行代码),设值就是set方法(如第7行代码)。

4.如果你想验证点语法是不是方法调用的话,有很多方法。

比如你可以在Student.m的set方法和get方法内部用NSLog加一些打印信息,如果程序运行后有输出打印信息,说明的确是调用了get方法或者set方法

 1 #import "Student.h"
 2  3 @implementation Student  4  5 - (void)setAge:(int)newAge {  6 NSLog(@"调用了setAge方法");  7 age = newAge;  8 }  9 10 - (int)age { 11 NSLog(@"调用了age方法"); 12 return age; 13 } 14 15 @end

三、点语法和self的陷阱

1.在Java中,this关键字代表着方法调用者,也就是说,谁调用了这个方法,this就代表谁。所以一般会这样写set方法:

1 public void setAge(int newAge) { 2 this.age = newAge; 3 }

第2行表示将newAge参数的值,赋值给方法调用者的成员变量age

2.OC中有个self关键字,作用跟this关键字类似。我这么说完,可能有人就会想这样写OC的set方法了:

1 - (void)setAge:(int)newAge {
2     self.age = newAge; 3 }

第2行中的self代表着当前调用setAge:方法的对象。但是第2行代码是绝对错误的,会造成死循环。因为我在前面已经说过了,OC点语法的本质是方法调用,所以上面的代码相当于:

1 - (void)setAge:(int)newAge {
2  [self setAge:newAge]; 3 }

很明显,会造成循环调用setAge:方法,程序就这样崩溃了

四、一点小建议

如果是第一次接触OC的点语法,你可能会真的 以为stu.age的意思是直接访问stu对象的成员变量age。其实,有一部分原因是因为我这里定义的Student类的成员变量名就叫做age。为了 更好地区分点语法和成员变量访问,一般我们定义的成员变量会以下划线 _ 开头。比如叫做 _age 。

1.Student.h,注意第4行

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Student : NSObject {  4 int _age;  5 }  6  7 - (void)setAge:(int)newAge;  8 - (int)age;  9 10 @end

2.Student.m,注意第6行和第10行

 1 #import "Student.h"
 2  3 @implementation Student  4  5 - (void)setAge:(int)newAge {  6 _age = newAge;  7 }  8  9 - (int)age { 10 return _age; 11 } 12 13 @end

转载于:https://www.cnblogs.com/tlios/p/4077368.html

学习笔记之06-点语法相关推荐

  1. Kotlin学习笔记(3)- 语法

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

  2. B站台湾大学郭彦甫|MATLAB 学习笔记|06 高阶绘图 Advanced Plot

    MATLAB学习笔记(06 高阶绘图 Advanced Plot) 如果想获得更好浏览体验的朋友可以转到下面链接 06 1. 对数图 (Logarithm Plots) x = logspace(-1 ...

  3. Python学习笔记 —— 独步天下推导式语法糖

    Python学习笔记 -- 独步天下推导式语法糖 前言 介绍 列表推导式 获取当月天数 字典推导式 模拟三条用户数据 结束语 前言 最近心血来潮,学习了一下Python,其中关于 推导式语法糖 感觉功 ...

  4. 前端学习笔记之CSS3基础语法与盒模型(二)

    前端学习笔记之 CSS3基础语法与盒模型 CSS3简介 CSS(cascading style sheet,层叠式样式表)是用来给HTML标签添加样式的语言 CSS3是CSS的最新版本,增加了大量的样 ...

  5. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

  6. ggplot2学习笔记2:ggplot()语法基础

    此博客作为自己的学习笔记,同时与大家交流分享! Mastering the Grammar 语法这一部分有点难理解,只是看文字描述的概念不易懂,最好是能在画图过程中去理解体会,只有了解了语法,才能掌握 ...

  7. python基础论文_北大博士Python学习笔记,Python基础语法总结,一篇文章带你入门...

    image.png 网上现在Python学习资料有很多,但是很杂.很多初学Python的朋友就不知道该怎么去抉择,那些是自己当下所需要的. 刚好朋友是北大的博士,在IT行业也工作八年了.就把他学习Py ...

  8. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:06 高级特征工程和NLP算法

    06 高级特征工程和NLP算法 6.1 词嵌入 6.2 word2vec基础 6.2.1 分布语义 6.2.2 定义word2vec 6.2.3 无监督分布语义模型中的必需品 6.3 word2vec ...

  9. 前端学习笔记之1 基础语法及标签

    引言 : 博主目前是一名iOS开发者, 所会的语言有Objective-C 和 Swift, 目前正在学习前端, 增强一下技术能力, 等学会点皮毛之后打算接触一下React Native; 这篇文章只 ...

  10. Java基础学习笔记三 Java基础语法

    Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...

最新文章

  1. javascript闭包,你大爷永远是你大爷
  2. 爸爸的素质决定孩子飞多高,爸爸们请反复看!!!
  3. C Tricks(十五)—— 算符优先级的表示
  4. 研发项目管理软件对比调研报告
  5. SPSS 特征筛选、主成分回归
  6. 23根火柴游戏程序,c语言实现人和计算机一起玩。 每日一题--20200423--
  7. 解决appium中Error: The port #8100 is occupied by an other process的问题
  8. 工业路由器和家用路由器的区别?
  9. ubuntu IPV6及作为路由分配【笔记】
  10. [2012山东ACM省赛] Fruit Ninja II (三重积分,椭球体积)
  11. 在那刹那间,俺的世界一片灰暗~~~
  12. windows系统旧服务器RAID5硬盘全部更换扩容实例
  13. jupyter内核无法连接,出现error,代码无法运行解决办法
  14. TFT供电电路(VCOM/VGL/VGH/AVDD)设计原理
  15. Unity 读取和修改XML文档
  16. android 会话通讯插件,Android版添加phonegap--融云即时通讯插件教程
  17. 贝恩解密NFT区块链游戏和收藏品市场
  18. java歪歪歪传隋唐英雄_[全屏全机型]歪歪歪传隋唐英雄
  19. textarea限制字数
  20. Facebook 广告效果越来越差,怎么办?

热门文章

  1. 网络营销外包——网络营销外包专员如何做好网站搜索引擎优化
  2. 网站建设套用模板后该如何做到出类拔萃?
  3. 营销型网站吸引用户说难也难,说简单也简单
  4. 网站优化助力网站在同行中更加出类拔萃
  5. 网站跳出率是SEO优化转化低的诱因之一
  6. java已知一个二叉树_Day58:对称的二叉树
  7. 赛码浪潮笔试题库软件实施岗位_2020年浪潮软件类笔试题
  8. 获取rawimage的像素点函数_光场相机数据二次开发基础-使用LFtoolbox解码lfp文件
  9. python 统计分析apache日志_python分析apache访问日志脚本分享
  10. OpenTSDB介绍——基于Hbase的分布式的,可伸缩的时间序列数据库,而Hbase本质是列存储...