黑马程序员技术交流社区
标题:
OC中对象的存储细节
[打印本页]
作者:
562413895@qq.co
时间:
2015-7-20 09:08
标题:
OC中对象的存储细节
1、[Person new]做了三件事:
1)、申请内存空间
2)、给实例变量初始化
3)、返回空间的首地址
申请的空间在内存的哪个区?new的时候申请的空间在内存的堆区(程序动态分配的内存空间);变量初始化时:若是基本类型,初始化为0;若是字符串类型,初始化为null。
2、实例变量又保存在什么地方?堆区
指针变量(iPerson)保存在栈区
3、对象方法保存在代码区
4、为何使用[iPerson new]就可以调用方法呢?
首先找iPerson对应的栈区的空间,然后找到_isa指针,再找到-isa指向的代码区的空间,然后到该空间找方法。
5、一个类可创建多个对象
Person *p1=[Person new];
Person *p2=[Person new];
Person类创建了两个对象p1和p2,这两个对象在内存中分配的是不同的存储地址,各成员属性的地址各不相同。
例://实现Person
#import <Foundation/Foundation.h>
//Person类的声明
@interface Person:NSObject
{
//类的属性(实例变量、成员变量)
@public
NSString *_name; //姓名
int _age; //年龄
float _weight; //体重
}
//人的行为(方法的声明)
//人跑
-(void)run ;
//散步
-(void)walk:(int) num;
@end
//iPhone 类的实现
@implementation Person
//人可以吃各种食物
-(void)run {
//吃完饭后,体重在原来基础上增加0.6
_weight +=0.6f;
NSLog(@"人正在跑");
}
//散步
-(void)walk:(int) num{
//每走100步,体重减去0.2
//234步,0.4=0.2*2
//num/100 *0.2f;
_weight-=num/100*0.2f;
NSLog(@"您走了%d步,当前体重为:%.2f",num,_weight);
}
@end
//主函数
int main(int argc,const char *argv[])
{
@autoreleasepool{
//创建对象,开空间,初始化,返回空间的首地址
Person *iPherson=[Person new];
//设定人的信息
iPerson ->_name=@"junjun";
iPerson->_weight=124.0f;
iPerson ->_age=25;
NSLog(@"姓名:%@,年龄:%d",iPerson->name,iPerson->age);
//调用方法
[iPerson eat:@"安徽板面"];
[iPerson eat:@"扎啤"];
[iPerson walk:234 ];
}
return 0;
}
作者:
狂甩你十八条街
时间:
2015-7-20 10:59
之前对堆区和栈区的概念很模糊,现在清楚多了,感谢分享
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2