屏幕快照 2017-09-18 13.26.27.png
屏幕快照 2017-09-18 14.48.02.png
屏幕快照 2017-09-18 14.49.01.png
main.m
#import <Foundation/Foundation.h>
#import "Gun.h"
int main(int argc, const char * argv[]) {
// 1.创建一把枪
Gun *gun = [Gun new];
// 2.设置枪的子弹数量
// gun->_bullet = 100;
// 引发这个问题的原因: 因为成员变量是public, 给成员变量赋值的时, 赋值的值不受我们的约束
// gun->_bullet = -100;
[gun addBullet:100];
// 3.射击
[gun shoot];
// 4.查看子弹的剩余数据(获取成员变量的值)
// NSLog(@"bullet = %i", gun->_bullet);
NSLog(@"BULLET = %i", [gun getBullet]);
return 0;
}
Gun.h
#import <Foundation/Foundation.h>
@interface Gun : NSObject
{
// @public
int _bullet; // 子弹
// 虽然成员变量不是public之后外界不能直接访问了, 但是还是可以在本类的对象方法中直接访问
}
/**
* 射击方法
*/
- (void)shoot;
// 提供一个方法用于设置成员变量的值
- (void)addBullet:(int)count;
// 提供一个方法用于返回成员变量的值
- (int)getBullet;
@end
Gun.m
#import "Gun.h"
@implementation Gun
- (void)shoot
{
if (_bullet > 0) {
_bullet--;
NSLog(@"打了一枪 , 还剩%i颗子弹", _bullet);
}else{
NSLog(@"没有子弹了");
}
}
// addBullet就是对成员变量的封装
- (void)addBullet:(int)count // -100
{
/*
封装: 屏蔽内部实现的细节, 仅仅对外提供共有的方法/接口
好处: 保证数据的安全性
将变化隔离
规范: 一般情况下不会对外直接暴露成员变量, 都会提供一些共有的方法进行赋值
成员变量都需要封装起来
*/
// 对传入的数据进行过滤
if (count < 0) {
count = 0;
}
_bullet = count;
}
- (int)getBullet
{
return _bullet;
}
@end