您当前的位置:首页 > 计算机 > 编程开发 > Objective-C

OC中的点语法

时间:05-12来源:作者:点击数:

点语法的功能

点语法是通过“类对象.属性”的方式来调用类中属性的一种方法(不唯一,KVC也可以,后边会提到)。

通过点语法,我们可以轻易的获取某个类对象中某个属性的值,或者为这个属性赋值。前提是这个属性能被调用。

例如,在Person类中声明了一个字符串类型的name属性(不是成员变量),可以采用以下方式调用name属性:

Person * person=[[Person alloc] init];//创建一个Person类的对象
person.name=@"ZhangSan";//调用person对象的name属性

点语法的底层实现

如果想弄清楚点语法的具体实现,就需要从类中创建属性的过程开始。

一个类创建属性,有两种方式。

方式一:创建一个Person类,编写以下代码:

在Person.h文件中:

#import <Foundation/Foundation.h>
@interface Person : NSObject{
//编写习惯,一般声明成员变量的时候名字前面加“_”,同时也是为了和下边声明的name相对应。
NSString * _name;
}
@property NSString * name;
@end

在Person.m文件中:

#import "Person.h"
@implementation Person
@synthesize name=_name;
@end

首先我们在.h文件创建了一个_name成员变量,它是受保护的(也就是不能在外界调用)。

然后我们在第6行创建了一个name属性。通过这行代码,OC底层隐式地创建了两个方法:

一个是set方法,
          -(void)setName:(NSString *)name;

一个是get方法:
          -(NSString *)name;

(这两个方法虽然你看不见,但是它的确存在)

在.m文件中,只有一行代码:
          @synthesize name=_name;

它的作用有两个:一:将我们在.h文件中声明的_name和name进行绑定(简单的理解,_name和name都是指name属性)。

二:对在.h文件声明的get方法和set方法做实现。具体地实现是这样的:set方法:(用于给属性赋值)

-(void)setName:(NSString *)name{
    _name=name;
}

get方法:(用于获取属性的值)

-(NSString *)name{
    return _name;
}

通过前面的学习,在.h文件中的方法是可以被外界调用,所以这两个方法可以被本类的对象调用。

通过调用这两个方法,我们就能对name这个属性进行赋值和获取值的操作。所以我们也可以叫它“方法属性”。(也可以叫“属性方法”)

方式二:在.h文件中:

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString * name;
@end

.m文件中没有代码

和前者对比,我们看到少了_name成员变量的声明和.m文件中的代码。但是,底层实现和前者是一样的,一个属性隐式生成带有“_”的成员变量,同时声明并实现了属性的set和get方法。(注意:两种方式虽然这样说起来好像是一样。但是还是有区别的:使用前者创建的set和get方法,可以同时被改写;而后者在这个类中只能改写一个,如果改写两个方法,程序会报错,提示找不到_name(原因就是没有将_name和name进行绑定)。可见,隐式创建的毕竟是他人给实现,不靠谱啊)。

对点语法的理解

点语法,简单的理解,就是通过“.”的方式通过调用类中的set或get方法操作属性。

下面我们来看看点语法的具体应用。

people.name=@"ZhangSan";

解释:people是一个类的实例化对象,name是这个类提供的方法属性。而两者中间的点就是点语法中的点。而这行代码实现的功能是:给people这个对象所具有的name方法属性进行赋值。

这行代码通过点语法调用的是类中的set方法,所以它还可以写成:[people setName:@"ZhangSan"];

同样,get方法也可以通过“.”的形式调用,例如,还是调用people对象的name属性。NSString * theName=people.name;

这段代码实现的功能时将people对象的name属性赋值给theName字符串。我们把它转化一下:NSString * theName=[people getName];

可能会有的疑惑:

1、有读者可能要问了,怎么才能知道调用的是哪个方法呢?其实有这样一个规律可循: 在没有等号的情况下,默认是get方法。 在有等号的情况下,我们就要分两种情况: 在等号左边是set方法。 在等号右边是get方法。

2、有读者可能有这个疑惑,对于两种创建方法属性的方式不知道选择哪个?

一般在实际开发过程中,我们可能只对get方法重写的时候比较多:
         -(NSString *)name{
         //添加一些代码
            return _name;
         }

大多数情况下,对于现在编程,我们选简单的那种;如果在编程过程中需要对set和get方法都进行重写,我们就在原有基础上改为第一种就可以了。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门