您的位置:首页 > 移动开发 > Objective-C

黑马程序员——ObjectiveC基础——封装、@property和点语法

2015-10-18 22:25 579 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、概述

面向对象的三个特性是:封装、继承、多态。

不封装的缺陷:当一个类把自己的属性暴露给外部的时候,该类就失去了对属性的管理权。

一个类,将自身的属性对外隐藏起来,只有通过此类提供的方法才能访问或设置实例变量,不可被外部任意调用或修改,这种机制叫做封装。

封装可以提高类的安全性,降低数据被误用的可能性。

在OC语言中,使用@interface和@implementation来处理类。@interface对类的属性和方法进行声明,向外部提供展示以及接口。@implementation则负责实现声明的方法,对外隐藏了具体实现。

通过在类中定义实例变量的设置器和访问器实现类的封装。

二、设置器和访问器的具体实现

1.设置器(setter)

Set方法的作用:为外界提供了一个设置成员变量值的方法。

要求:

1)方法名必须以set开头。

2)Set后边跟上成员变量的名称(去掉下划线),首字母大写。

3)返回值一定为void。

4)一定接受一个参数,这个参数的数据类型要和设置的成员变量的数据类型一致。

5)形参名不能喝成员变量重名。

使用设置器的好处:

1)不让数据暴露在外,保证数据安全性。

2)可以对设置的数据进行验证或过滤。

2.访问器(getter)

get方法的作用:为调用者返回对象内部的成员变量。

要求:

1)一定有返回值,返回值的类型和成员变量的返回值类型一致。

2)方法名和成员变量名一样。

3)不需要接受任何参数。

示例代码:

现在有一个成绩类 。

其中包括语文、数学、平均分三个变量

要求:语文、数据两个变量可读可写,平均分变量只读,当语文、数学两个变量有任何一个值改变时,平均分的值随之变化。

Chengji.h

#import <Foundation/Foundation.h>

@interface ChengJi : NSObject
{
float _yuwen;
float _shuxue;
float _pingjunfen;
}
-(void)setYuwen:(float)yuwen;
-(float)yuwen;
-(void)setShuxue:(float)shuxue;
-(float)shuxue;
-(float)pingjunfen;
@end


Chengji.m

#import "ChengJi.h"

@implementation ChengJi
-(void)setYuwen:(float)yuwen{
_yuwen = yuwen;
_pingjunfen = (_shuxue+_yuwen)/2;
}
-(float)yuwen{
return _yuwen;
}
-(void)setShuxue:(float)shuxue{
_shuxue = shuxue;
_pingjunfen = (_shuxue+_yuwen)/2;
}
-(float)shuxue{
return _shuxue;
}
-(float)pingjunfen{
return _pingjunfen;
}
@end


main.m

#import <Foundation/Foundation.h>
#import "ChengJi.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
ChengJi *cj = [ChengJi new];
[cj setYuwen:85.5f];
[cj setShuxue:90.0f];

NSLog(@"\n小明的成绩:语文:%.2f  数学:%.2f  平均分:%.2f",[cj yuwen],[cj shuxue],[cj pingjunfen]);
}
return 0;
}


三、@property

在Xcode4.4版本以上,可以通过在声明文件中使用@property关键字实现设置器和访问器的设置。

例如:

成员变量 int _age; 可以如下声明:

@property int age;

示例代码

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
int _age;
NSString *_name;
}
@property int age;
@property NSString *name;
@end


Person.m

#import "Person.h"

@implementation Person

@end


main.m

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p setName:@"Bob"];
[p setAge:12];
NSLog(@"姓名%@:年龄%d",[p name],[p age]); //姓名Bob:年龄12
}
return 0;
}


四、点语法

点语法是XCode特性,XCode帮助我们做了代码替换。

Person 类的属性_age,并且该属性拥有set和get方法。此时:

p.age xcode会判断p.age 是set还是get方法,从而自动替换着这些代码。

注意:

点语法的本质是方法调用,而不是访问成员变量。当一个变量没有set和get方法时,是无法使用点语法的。

在set/get的函数中,不能使用self.变量名的点语法,会方法的死循环(一个方法,不能调用它本身)

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
p.setName = @"Bob";
p.setAge = 12;
NSLog(@"姓名%@:年龄%d",p.name,p.age); //姓名Bob:年龄12
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: