//*************对象的存储细节*********
//创建对象
Person *p = [Person new];
[Person new] 做了3件事情
// 1) 申请内存空间
// 2)给实例变量初始化
// 3) 返回空间的首地址
1、申请的空间在内存的哪个区?
// new 的时候申请的空间在内存的堆区(程序动态分配的内存空间)
// 当new的时候内存的布局是这么样的
//初始化的时候:
//如果实例变量是基本数据类型,此时给初始化为0
//如果 。。。。OC字符串类型 null
2、实例变量又保存在什么地方 //即实例对象
// 堆区(动态分配内存)
// p(指针变量) 存放在栈区(存放局部变量)
3、对象方法保存在什么地方
// 代码区
4、为什么使用 [p run]; 就可以调用方法了 ?如何调用的
//每一个对象都包含一个isa指针.这个指针指向当前对象所属的类。
// 首先找p对应的堆区的空间,然后找到 _isa指针,再找到_isa指向的代码区的空间,然后到该空间中找方法
5、一个类可以创建多个对象
当使用一个类创建多个对象的时候,注意:
1)不同的对象在内存中分配的是不同的存储地址,所以各成员属性的地址也各不相同
//*********** #pragma mark指令的使用 ******
功能:简单来说就是对代码的分组,方便代码查找和导航用的
1)第一种用法:分隔线
#pragma mark -
// 注意 #pragma mark – 的“-”后面不能有空格。
2)第二种用法:
#pragma mark 分组(标识)名称
#pragma mark – 标识名称
补充:
#warning 处理未完成的任务, 方法
//*********** 函数和对象方法的区别 ***********
对象方法:
-(void)run;
(1)对象方法的实现只能写在@implementation...@end中,对象方法的声明只能写在 @interface...@end中间
(2)对象方法都以-号开头,类方法都以+号开头
(3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,函数的声明可以再main函数内部也可以在main函数外部。
(5)对象方法归类\对象所有
函数:
void run(){
}
(1)所有的函数都是平行的
(2)函数不存在隶属关系
(3)使用的时候可以直接调用
(4)不可以访问对象中的成员变量
//*********** 对象和方法之间的关系 ********
1)对象作为方法的参数
// 方法名 形参数类型 形参数名
-(void)dispPerson:(Person *) person;
Person *p1 = [Person new];
[p dispPerson:p1] //对象作为方法的实参
2)对象作为方法的返回值
-(Person *)changePerson:(Person *)person{
person->name = @"唐僧";
return person;
}
//***************** 对象作为方法的参数连续传递 ***************
/*
士兵开枪 枪射击子弹
枪类:
名称:Gun
属性:型号(_size),子弹个数(_bulletCount)
行为:射击
人类
名称:Soldier
属性:姓名(_name) life level(等级)
行为:跑 蹲 开枪 跳
子弹类(弹夹)
名称:Bullet
属性:子弹个数,型号(_model)
//要求士兵在射击的时候,不但要给一把枪,还要给 一个弹夹才能射击
//子弹不能为负数
*/
#import <Foundation/Foundation.h>
#pragma mark -子弹类的定义
@interface Bullet:NSObject
{
@public;
int _bulletCount;
}
@end
#pragma mark -子弹类的实现
@implementation Bullet
@end
//#pragma mark -
#pragma mark -Gun类定义
@interface Gun:NSObject
{
}
-(void)shoot:(Bullet *)bullet;
@end
#pragma mark -Gun类实现
@implementation Gun
-(void)shoot:(Bullet *)bullet{
if (bullet->_bulletCount >0) {
bullet->_bulletCount--;
NSLog(@"枪正在凸凸凸射击!!剩余的子弹为:%d",bullet->_bulletCount);
}else{
NSLog(@"子弹都没有了,射个毛!!!"); }
}
@end
#pragma mark -Soldier类定义
@interface Soldier:NSObject
{
}
-(void)shootByGun:(Gun *)gun andBullet:(Bullet *)bullet;
@end
#pragma mark -Soldier类实现
@implementation Soldier
-(void)shootByGun:(Gun *)gun andBullet:(Bullet *)bullet{
[gun shoot:bullet];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Bullet *b1 =[Bullet new];
b1->_bulletCount=3;
Gun *ak47 =[Gun new];
Soldier *s1 =[Soldier new];
NSLog(@"现在大兵手上的子弹还有%d颗!!!",b1->_bulletCount);
[s1 shootByGun:ak47 andBullet:b1];
[s1 shootByGun:ak47 andBullet:b1];
[s1 shootByGun:ak47 andBullet:b1];
[s1 shootByGun:ak47 andBullet:b1];
}
return 0;
}
//*********************************************
// 思考&实现1: 设计一个”学生“类 1> 属性
// * 姓名
// * 生日
// 用结构体作为类的实例变量(生日)
#import <Foundation/Foundation.h>
typedef struct {
int year;
int month;
int day;
}Date;
@interface Student : NSObject
{
@public;
NSString *_name;
Date _birthday;
}
@end
@implementation Student
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *p1 =[Student new];
p1->_name =@"逗比";
//初始化p1
//第1种方法 强制类型转换
p1->_birthday =(Date){1991,10,23};
//第2种方法 定义一个结构体变量
Date b1 ={1993,4,21};
p1->_birthday =b1;
//第3种方法 逐个赋值
p1->_birthday.year =1993;
p1->_birthday.month =1;
p1->_birthday.day =25;
}
return 0;
}