您的位置:首页 > 其它

二、oc中的setter与getter方法以及点语法

2015-03-07 22:44 435 查看
   
------- <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>、<a href="http://www.itheima.com" target="blank">.Ios培训</a>、期待与您交流! -------

       我们知道,在oc中,会有类的概念,我们可以将大致相同概念的东西归为一个类。大部分类中会包含有成员变量,初学时,我们会将成员变量设置为public类型,因为这样方便于我们进行赋值运算,可以通过''->''运算符进行调用。

@interface Person : NSObject
{
@public // 将成员变量设置为公有类型,在任何地方都可以给它赋值
int _age;
double _height;
}

@end

@implementation Person

@end

int main()
{
Person *p = [Person new];

p->_age = 90;  // 通过->运算符,给_age赋值
p->_height = 200; // 通过->运算符,给_height赋值

NSLog(@"_age = %d,_height = %.2f",p->_age,p->_height); // 打印相应的值,用于检测,赋值是否成功
return 0;
}
      但是,一般情况下,并不提倡使用public类型的成员变量,因为这样,会使这个类中的成员变量的安全性降低,公开化太高,任何人都可以修改成员变的值,保密性也较差。因此,一般选择设置为pravite类型或者是protected类型。pravite类型是成员变量,即为在该类中可以直接访问。protected类型的成员变量,即为该类与该类的子类中可以直接访问。

     直接访问是指,直接给变量进行赋值。设置为了pravite与protected类型的成员变量,虽然部分情况下不能直接访问成员变量,但是可以通过setter与getter方法访问成员变
4000
量。

  例如:

#import<Foundation/Foundation.h>

@interface Person : NSObject
{
@private // 将成员变量设置为私有类型,只能在该类中直接访问
int _age;
double _height;
}
- (void)setAge:(int)age; // _age的setter方法的声明
- (int)age;              // _age的getter方法的声明

- (void)setHeight:(double)height; // _height的setter方法的声明
- (double)height;                 // _height的getter方法的声明
@end

@implementation Person

- (void)setAge:(int)age // _age的setter方法的实现
{
_age = age;
}
- (int)age // _age的getter方法的实现
{
return _age;
}

- (void)setHeight:(double)height // _height的setter方法的实现
{
_height = height;
}
- (double)height // _height的getter方法的实现
{
return _height;
}

@end

int main()
{
Person *p = [Person new];

[p setAge:10]; // 调用_age的setter方法,等同于_age = 10
NSLog(@"_age = %d",[p age]); // 输出_age的getter方法

[p setHeight:175]; // 调用_height的setter方法,等同于_height = 175
NSLog(@"_heighr = %.2f",[p height]); // 输出_height的getter方法

return 0;

}


 setter方法
 1.作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤
 2.命名规范:
 1>方法名必须以set开头
 2> set后面跟上成员变量的名称
 3> 返回值一定是void
 4> 一定要接收一个参数,而且参数类型跟成员变量类型一致
 5> 形参的名称不能跟成员变量一样
 getter方法
 1.作用:返回对象内部的成员变量
 2.命名规范:
 1> 肯定有返回值,返回值类型肯定与成员变量类型一致
 2> 方法名跟成员变量名一样
 3> 不需要接收任何参数
 setter方法,一般是用于设置不能直接访问的成员的变量的值,例如:需要在main函数中给Person类中的成员变量_age与_weight赋值,这时可以用到setter方法。
  getter方法,一般是用于在setter方法已经设置好了成员变量的值后,用于查看当前成员变量的值,常与setter方法配合使用。
  
 上面是setter方法与getter的基本写法,但是当成员变量过多的时,这样重复写同一类型的代码,会显示很无意义。因此我们可以用更加简洁的方法,来写setter于getter方法。
   例如:
#import<Foundation/Foundation.h>

@interface Person : NSObject
{
@private // 将成员变量设置为私有类型,只能在该类中直接访问
int _age;
double _height;
}
@property int age; // _age的sette与getter方法的声明
@property double height; // _height的setter与getter方法的声明
@end

@implementation Person

@synthesize age = _age; // 其实这里也可以不用写
@synthesize height = _height; // 同上

@end

int main()
{
Person *p = [Person new];

[p setAge:10]; // 调用_age的setter方法,等同于_age = 10
NSLog(@"_age = %d",[p age]); // 输出_age的getter方法

[p setHeight:175]; // 调用_height的setter方法,等同于_height = 175
NSLog(@"_heighr = %.2f",[p height]); // 输出_height的getter方法

return 0;

}


   用@property与@syntheszie的方法,可以快捷方便的达到相应的成员变量的setter与getter方法,通过同样的检测方法,可知,设置成功。其实在新版本的xcode中,可以更加简洁,可以只写出@property方法,不需要写@synthesize方法,也可以达到设置好setter于getter方法的目的。

  @property与@synthesize,其实苹果官方已经封装好的方法,初学者,可以不用深究起具体实现的步骤,记住其书写的格式即可,这样可以便于快捷的写出setter于getter方法,这也是面向对象编程的一大好处。

    点语法,同样也是为setter月getter方法服务的,一般情况下我们使用  [方法执行者 方法  :  传参]的形式来调用setter与getter方法。但是点语法可以更加直观与快捷。

   例如:(上面代码中main函数中可以改为:)

int main()
{
Person *p = [Person new];

p.age = 10; // 调用_age的setter方法,等同于_age = 10
NSLog(@"_age = %d",p.age); // 输出_age的getter方法

p.height = 175; // 调用_height的setter方法,等同于_height = 175
NSLog(@"_heighr = %.2f",p.height); // 输出_height的getter方法

return 0;

}

          

       当写成p.age时,系统会自动调用相应的setter方法与getter方法。有人会问,这个是怎么识别是setter方法与getter方法的呢。其实比较简单,当p.age被赋值的时候,例如p.age = 90时,系统会自动调用_age的setter方法,给_age赋值,若写成p._age,则系统默认是给__age赋值。

   当p.age传递一个值给另外一个变量,或者是返回一个值时,例如 int b = p.age,那么系统会自动调用_age的getter方法,返回出一个值。

  

   综上所述,setter方法与getter方法都是oc中最最基本的语法,是初学者必须掌握好,并且熟练的语法,他可以便于我们操作成员变量。点语法也是为了setter方法与getter方法服务的,为程序员提供易读且直观的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: