【Objective-C】1.oc点语法

在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/XieMinQiang/p/5275477.html

OC基本语法 一。Oc语法预览: 1.关键字:绝大部分以@开头,部分不是: self、super、id、_cmd、__block、__strong、__weak、 2.字符串以@开头:@"hello"是OC中的字符串 3.其他: ---基本数据类型:char,int,float,double,BOOL(YES/NO) ---nil相当于NULL 也就是0 ---输出函数:NSLog(@"Hello... 阅读详情

相关推荐

oc基础语法

m是OC源文件扩展名,入口也是main函数,第一个OC程序: #import int main(int argc, const char * argv[]) { theme manager     @autoreleasepool {         NSLog(@"Hello, World!");     }     return 0; } 预处理指令import会自动检

lingduya的博客 877

Objective-c - 语法

/*  1> 语法:     作用:快速调用属性的setter/getter方法.       语法:对象名.去掉下划线的属性名     赋值则自动调用当前属性的setter方法:对象名.去掉下划线的属性名 = 数据;     取值则自动调用当前属性的getter方法:对象名.去掉下划线的属性名.    2> 语法的本质     语法

SAGGITARXM 381

Windows游戏玩家必看:用Process Lasso优化CPU优先级和核心绑定,告别卡顿

本文为Windows游戏玩家详细介绍了如何使用Process Lasso优化系统性能。通过设置CPU优先级和核心绑定,可以智能管理进程资源,确保游戏获得最高调度权限,有效减少因后台程序干扰或Windows调度机制不完善导致的卡顿与帧数波动,从而提升游戏流畅度与稳定性。

weixin_29299807的博客 2126

Objective-C之语法和属性

.语法        语法的本质是对 set 和get方法的调用. Student *stu = [[Student alloc] init]; stu.ID = 10;//set方法         注意:         1.stu.ID = 10,不是给Student成员变量ID “直接赋值”,而是调用Student中的setID方法,“间接”给成员变量赋值,并且传递10,所...

Null959_的博客 1302

Objective-C语法

一、语法1. 语法:方便其它编程语言的程序员快速地转移到iOS开发中。2. 语法是编译层次的概念,最终还需通过编译器转换成经典方法。3. 语法放在"="运算符的左边,等价于调用对应实例变量的setter方法。xiaoMing.name = @"小明"; //&lt;==&gt; [xiaoMing setName:@"小明"];    没有放在"="运算符的左面,等价于调用对应实例变量的g...

咚个里个呛的博客 280

Objective-C语法基础

Objective-C语法基础

qq_44974032的博客 1108

Objective-C ---语法 (梳理整理)

为什么80%的码农都做不了架构师?>>> ...

weixin_34288121的博客 188

Objective-C中的@property、@synthesize及语法

Objective-C中的@property、@synthesize及语法都是与两个函数有关的,一是setter函数,另一个是getter函数 以前我们是这样来定义setter与getter函数的 @interface Dog:NSObject { int age; } -(void)setAge:(int)newAge; -(void)age; @end @implementati

出头天 3709

Objective-C教程之创建项目及OC基础语法(01

写在前面 本菜鸡前端小白,实习期公司业务需求缺个iOS开发,菜鸡有想做iOS,加上组长鼓励就开始入坑iOS开发了(嘤嘤嘤菜鸡原本只想划划水),前期学了一周swift,好用是好用,但是由于swift对个人开发者比较友好,而OC对大型项目来说比较友好,毕竟OC的社区成熟稳定,掉坑了能比较快的找到解决方案,加上需要接手的项目是OC写的,所以最终还是打算入坑OC。 虽然觉得暂时放下swift有可惜,毕...

MyEmun的博客 622

Objective-C语法语法

本文目录 前言 一、传统的get方法和set方法 二、使用语法代替传统的get方法和set方法 三、语法和self的陷阱 四、一小建议 著作权声明:本文由 @m了个j 原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢! 前言 在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"语法"。比如: 1...

diemeng9989的博客 109

IOS学习之二:Objective-C基础语法和关键字

对于一门语言得学习,个人觉得最主要得就是其语法格式和那些关键字。 因为对于基本现在大多数得语言,每种语言都是一种符合人思维得方式来与计算机交流。 因此,其实每种语言中定义或是封装好得基础类和类库,其实都是很相似得。 比如 int,double几种基本类型,String,数组,集合以及字典数据类型。 因此你在编程时比如你想以字符串形式和计算机交流,那你很容易就能想到在C中可以使用String

killnono 1万+

OC基础语法<1.1> 入门面向对象语法-OC类、语法

一:OC语言概述 超链接地址 二:简单的OC类和语法应用

克丽丝—>小菲儿的专栏 612

OC基础—语法概述(初步了解Objective-C)

Objective-C语法概述 Ob

ly307637627的专栏 1350

OC开发之——语法(24)

一 概述 本节课主要介绍OC中的语法 Java中的.语法是访问成员变量 OC中的.语法是方法调用 二 语法本质说明 2.1 示例类 //声明(Person.h) @interface Person : NSObject { int _age; NSString * _name; } -(void)setAge:(int)age; -(int)age; -(void)s...

我的博客 364

OC-语法

说明: java/C++等语言中可以通过对象.方法名/成员变量的形式进行操作。OC中也有类似的语法,但与其他语言也有所区别。 OC中的语法主要用途是对成员变量的getter和setter的设置,其次,当成员函数的参数列表为空时,也可以使用语法调用这类成员函数。 @property属性 假设有一个Student类,该类具有若干个成员变量,如果每个成员变量都写getter和setter函

有所不同 922

Objective-C基础

Objective-C

小朱的博客 1555

Objective-C】06-语法

前言 在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"语法"。比如: 1.在Student类的第2行定义了一个公共的成员变量age 1 public class Student { 2 public int age; 3 } 2.然后在第5行通过语法直接给stu的成员变量age赋值 1 public clas...

aaa1231722的博客 86

黑马程序员——OC类的初始化与语法

一、类的初始化方法每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的. 下面来看一下如何自定义初始化方法: Person.h#import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *_name; NSInteger _age; } //自定义初始化方法,必须以ini

c9527ios的博客 428

OC简介及基本语法(一)

1.什么是OCObjective-C简称Obj-C或者OCObjective的意思就是面向对象的。OC其实就是在C语言的基础之上,封装了一层面向对象的语法,他并不是一门全新的编程语言。OC是Mac OS X系统和iOS系统的主要开发编程语言。C程序的源文件的后缀名为.c,OC程序的源文件是后缀名为.m,m就是message的意思。因为OC是完全兼容C语言的,所以在.m文件之中是可以写任意的C代码。并且OC中main函数仍然是OC程序的入口,作用和C语言中的是一样的。 (1).#import指令

程序猿老樊的博客 8341
上一篇: 那些好用的iOS开发工具
下一篇: Totime iOS购物APP
dod83985
博客等级 码龄12年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值