ObjectiveC基础——封装、@property和点语法

一、概述
面向对象的三个特性是:封装、继承、多态。
不封装的缺陷:当一个类把自己的属性暴露给外部的时候,该类就失去了对属性的管理权。
一个类,将自身的属性对外隐藏起来,只有通过此类提供的方法才能访问或设置实例变量,不可被外部任意调用或修改,这种机制叫做封装。
封装可以提高类的安全性,降低数据被误用的可能性。
在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值