OC基础--对象做参数在方法间传递
剧情描述:
美国大兵抗把汉阳造 拿着5个弹夹(每个弹夹5发子弹) 带着弟兄们干架 子弹打完了就求救
类:
士兵:
属性: 姓名(_name) 身高(_height) 体重(_weight)
行为: 开枪(fire) 求救(callForHelp)
枪:
属性: 弹夹(_clip) 弹夹数量(_clipNum) 品牌(_model)
行为: 换弹夹(changeClip) 发射子弹(shot)
弹夹:
属性: 子弹数量(_bulletCount)
行为: 装子弹(addBullet)
方法说明:
士兵开枪方法(fire)
参数: 枪 和 弹夹
返回值: 剩余弹夹数量
逻辑: 将弹夹作为参数 调用枪的发射子弹方法(shot) 获得剩余弹夹数
如果剩余弹夹数 == 0 则调用自己的求救方法(callForHelp)
枪发射子弹方法(shot)
参数: 弹夹
返回值: 弹夹数
逻辑: 如果弹夹里的子弹==0 则调用自己的换弹夹的方法获得新弹夹 否则弹夹子弹减1
枪换弹夹方法(changeClip)
参数: 弹夹
返回值: 弹夹数量
逻辑: 将弹夹数量-1(因为已经用了一个了) 如果还有弹夹 则调用弹夹的装子弹方法 否则提示子弹打光了
弹夹装子弹方法(addBullet)
参数: 无
返回值: 弹夹对象
逻辑: 如果弹夹内子弹数量==0 则装5发子弹 然后将弹夹返回
对象去哪了:
士兵开枪接收了枪和弹夹对象 开枪方法中将弹夹对象传入枪的发射子弹方法 发射子弹方法中又将弹夹对象传入换弹夹方法 换弹夹方法中调用这个弹夹对象的加子弹方法 获得一个弹夹对象的返回值 返回的这个弹夹对象 嘿嘿 不好意思 没用到
弹夹类声明文件Clip.h:
/*
弹夹
事物名称: 弹夹(Clip)
属性:子弹数量(_bulletCount)
行为:装子弹(addBullet)
*/
#import <Foundation/Foundation.h> @interface Clip : NSObject
{
@public
// 子弹数量
int _bulletCount;
}
//给弹夹装子弹
- (Clip *) addBullet;
@end
弹夹类实现文件Clip.m:
#import "Clip.h" @implementation Clip // 给弹夹装子弹 假设装一次 弹夹就少一个(代表换弹夹) 返回弹夹对象其实没被用到
- (Clip *)addBullet{
if(_bulletCount == ){
_bulletCount = ;
NSLog(@"clip 新兵蛋子 子弹装好了 你去冲吧 子弹数量:%i", self->_bulletCount);
}
return self;
}
@end
枪类声明文件Gun.h:
/*
枪
事物名称:枪(Gun)
属性:大弹夹(_bigClip) , 弹夹数量(_clipNum), 型号(model)
行为:换弹夹(changeClip) 射击(shot)
*/
#import <Foundation/Foundation.h>
#import "Clip.h" @interface Gun : NSObject
{
@public
// 弹夹对象
Clip* _bigClip;
// 弹夹数量
int _clipNum;
// 枪的牌子
NSString* _model;
}
// 换弹夹方法
- (int) changeClip:(Clip *) newClip;
// 发射子弹方法
- (int) shot:(Clip *) clip;
@end
枪类实现文件Gun.m:
#import "Gun.h" @implementation Gun
// 换弹夹方法 接收弹夹对象 返回弹夹数量
- (int)changeClip:(Clip *)clip{
// 需要换弹夹说明已经用了一个了 弹夹数量 -1
_clipNum -= ;
// 如果还有弹夹 则调用弹夹加子弹的方法
if (_clipNum > ) {
_bigClip = [clip addBullet];
NSLog(@"gun 装弹完毕 子弹数量:%i 继续干", clip->_bulletCount);
}
else{
NSLog(@"gun 子弹打光了");
}
return _clipNum;
}
// 枪发射子弹方法 接收弹夹对象 返回弹夹数量
- (int)shot:(Clip *)clip{
// 变量存储弹夹数量 (可以不用这个变量 直接使用属性成员)
int clipNum = _clipNum;
// 如果弹夹内没子弹了 则调用换弹夹方法
if (clip->_bulletCount == ) {
NSLog(@"gun 友情提示: 大哥 你没子弹了 俺去给你装弹 你先拼会刺刀吧 装好了再通知你 好吗 就这么愉快的决定吧");
clipNum = [self changeClip:clip];
}
// 否则 子弹 -1
else{
NSLog(@"gun 子弹 减 1");
clip->_bulletCount -= ;
}
return clipNum;
}
@end
士兵类声明文件Soldier.h:
/*
士兵
事物名称: 士兵(Soldier)
属性:姓名(name), 身高(height), 体重(weight)
行为:打枪(fire), 打电话(callPhone)
*/
#import <Foundation/Foundation.h>
#import "Gun.h" @interface Soldier : NSObject
{
@public
NSString* _name;
double _height;
double _weight;
}
- (int) fireWithGun:(Gun*) gun andClip:(Clip *) clip;
- (void) callForHelp;
@end
士兵类实现文件Soldier.m:
#import "Soldier.h" @implementation Soldier
// 士兵开枪 接收枪和弹夹两个对象 返回弹夹剩余数
- (int)fireWithGun:(Gun *)gun andClip:(Clip *)clip{
NSLog(@"soldier 儿子们 孙子们 王八羔子们 都跟我一起上 冲啊 杀鸡鸡~~~");
// 将弹夹对象传入 调用枪射击的方法
int remainClipNum = [gun shot: clip];
// 如果没弹夹了 调用求救方法
if( == remainClipNum){
[self callForHelp];
}
return remainClipNum;
}
- (void)callForHelp{
NSLog(@"soldier 拐洞拐 我没子弹了 还中弹了 中了好多呢 你是不知道 吓死宝宝了 快来9我吧 等 你哦 么么哒");
}
@end
Main.m:
#import <Foundation/Foundation.h>
#import "Soldier.h" int main(int argc, const char * argv[]) {
// 士兵对象
Soldier * soldier = [Soldier new];
soldier->_height = 2.12;
soldier->_weight = ;
soldier->_name = @"美国大兵";
// 弹夹对象
Clip * clip = [Clip new];
clip->_bulletCount = ; // 枪对象
Gun * gun = [Gun new];
gun->_bigClip = clip;
gun->_model = @"汉阳造";
gun->_clipNum = ; // 士兵开始干架
// 保存剩余弹夹数量 如果数量==0 则跳出循环
int remainClip = ;
while () {
// 调用士兵开枪方法 获得剩余弹夹数
remainClip = [soldier fireWithGun:gun andClip:clip];
if (!remainClip) {
break;
}
}
return ;
}
输出结果:
/*
输出结果:
应该是循环五次后提示子弹打光了 然后求救 每次循环中发射五颗子弹
2015-08-27 23:18:37.182 对象做参数传递[892:34503] soldier 儿子们 孙子们 王八羔子们 都跟我一起上 冲啊 杀鸡鸡~~~
2015-08-27 23:18:37.184 对象做参数传递[892:34503] gun 子弹 减 1
2015-08-27 23:18:37.184 对象做参数传递[892:34503] soldier 儿子们 孙子们 王八羔子们 都跟我一起上 冲啊 杀鸡鸡~~~
2015-08-27 23:18:37.184 对象做参数传递[892:34503] gun 子弹 减 1
2015-08-27 23:18:37.184 对象做参数传递[892:34503] soldier 儿子们 孙子们 王八羔子们 都跟我一起上 冲啊 杀鸡鸡~~~
2015-08-27 23:18:37.185 对象做参数传递[892:34503] gun 子弹 减 1
2015-08-27 23:18:37.185 对象做参数传递[892:34503] soldier 儿子们 孙子们 王八羔子们 都跟我一起上 冲啊 杀鸡鸡~~~
2015-08-27 23:18:37.185 对象做参数传递[892:34503] gun 子弹 减 1
2015-08-27 23:18:37.185 对象做参数传递[892:34503] soldier 儿子们 孙子们 王八羔子们 都跟我一起上 冲啊 杀鸡鸡~~~
2015-08-27 23:18:37.185 对象做参数传递[892:34503] gun 子弹 减 1
2015-08-27 23:18:37.186 对象做参数传递[892:34503] soldier 儿子们 孙子们 王八羔子们 都跟我一起上 冲啊 杀鸡鸡~~~
2015-08-27 23:18:37.186 对象做参数传递[892:34503] gun 友情提示: 大哥 你没子弹了 俺去给你装弹 你先拼会刺刀吧 装好了再通知你 好吗 就这么愉快的决定吧
……………
…………….
…………….
…………….
2015-08-27 23:18:37.217 对象做参数传递[892:34503] gun 子弹打光了
2015-08-27 23:18:37.217 对象做参数传递[892:34503] soldier 拐洞拐 我没子弹了 还中弹了 中了好多呢 你是不知道 吓死宝宝了 快来9我吧 等你哦 么么哒
*/
OC基础--对象做参数在方法间传递的更多相关文章
- OC基础4:类和方法
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.类的声明(@interface)要放在 ...
- 反射的妙用-类名方法名做参数进行方法调用实例demo
首先声明一点,大家都会说反射的效率低下,但是大多数的框架能少了反射吗?当反射能为我们带来代码上的方便就可以用,如有不当之处还望大家指出 1,项目结构图如下所示:一个ClassLb类库项目,一个为测试用 ...
- flask中request对象获取参数的方法
从当前request获取内容: method: 起始行,元数据 host: 起始行,元数据 path: 起始行,元数据 environ: 其中的 SERVER_PROTOCOL 是起始行,元数据 he ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- Java方法的参数传递方式为: 值传递
Java方法的参数传递方式为: 值传递 对于基本数据类型作为参数传递时, 是"按值传递", 这点都认识很清楚. 但是, 当对象或者说引用作为参数传递, Java 的参数传递方式是& ...
- IBinder对象在进程间传递的形式(一)
命题 当service经常被远程调用时,我们经常常使用到aidl来定一个接口供service和client来使用,这个事实上就是使用Binder机制的IPC通信.当client bind servic ...
- block 做参数
三部分 1,定义函数 /* 传出类定义block */ //定义block typedef void (^ItemClickBlock)(NSInteger selectedIndex); //blo ...
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
- java基础之对象当做参数传进方法的堆栈内存解析
值类型当做参数传进方法: 引用类型对象当做参数传进方法: String字符串当做参数传进方法:
随机推荐
- Arduino 极速入门系列 - 光控灯(1)- 关于理论和 LED 那些事
点个 LED 闪亮好像太单调,这次来个光控 LED 灯.这个其实不需要 Arduino 也能做,这次只是用来演示一下 PWM 在 Arduino 里面的做法.PWM 原理后面会解释.这次用充电宝提供 ...
- js设计模式总结-单例模式
单例模式 解决的问题 保证实例只有一个,避免多个实现,从全局来看,这个实例的状态是唯一的. 实现原理 设置一个变量来记录实例,通过检测该变量是否为空来决定是否创建实例 非透明单例 所谓非透明就是用户在 ...
- Freemarker中日期时间格式出错
今天遇到一个奇怪的问题.同事访问我电脑发布的程序页面,freemarker日期格式报错.而其他电脑访问则没有问题. 先贴出错误信息. FreeMarker template error The str ...
- localhost访问错误Forbidden You don't have permission to access / on this server.解决办法(亲测)
在httpd.conf文件下找到这段: <Directory /> Options FollowSymLinks AllowOverride None Order deny,allow D ...
- an interview question(2)
感觉现在好多面试题还是很注重基础的,今天面试时就遇到这题,回来一查后才知道此题是国内某著名通信公司的一道机试题:) 给定一个数组input[ ],如果数组长度n为奇数,则将数组中最大的元素放到 out ...
- A*算法 -- 八数码问题和传教士过河问题的代码实现
前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...
- golang 管道
2.管道简介Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性.本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具 ...
- Android热修复之微信Tinker使用初探
文章地址:Android热修复之微信Tinker使用初探 前几天,万众期待的微信团队的Android热修复框架tinker终于在GitHub上开源了. 地址:https://github.com/ ...
- [转]IE8兼容Jquery.validate.js兼容问题
只需在jquery.validate.js 文件中在446行附近找到return $([]).add(this.currentForm.elements).filter(":input&qu ...
- Linux(Ubuntu 14.04) setting up OpenGL
1. Install c/c++ compilation package. 2. install openGL and freeGlut library sudo apt-get install me ...