A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 562413895@qq.co 中级黑马   /  2015-7-20 09:08  /  579 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;
}

1 个回复

倒序浏览
之前对堆区和栈区的概念很模糊,现在清楚多了,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马