例子:
- #import <Foundation/Foundation.h>
- @interface Person : NSObject
- {
- @public
- int _age;
- float _weight;
- NSString *_name;
- }
- //行为
- -(void)run;
- @end
- @implementation Person
- -(void)run{
- NSLog(@"人正在跑");
- }
- @end
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
-
- //创建对象
- Person *p = [Person new];
- p->_name = @"柯南";
- p->_age = 13;
-
- //_age 0
- //_name null
-
- NSLog(@"姓名:%@,年龄:%d,体重:%f",p->_name,p->_age,p->_weight);
-
- [p run];
- }
- return 0;
- }
复制代码 1.我们知道[Person new] 做了3件事情
1) 申请内存空间
2)给实例变量初始化
3) 返回空间的首地址
2.那么问题来了:
(1)申请的空间在内存的哪个区?
答:new 的时候申请的空间在内存的堆区(程序动态分配的内存空间) 当new的时候内存的布局如下: 初始化的时候:如果实例变量是基本数据类型,此时给初始化为0;如果 实例变量是OC字符串类型 ,此时给初始化为 null (2)实例变量又保存在什么地方?
答:实例变量存放在堆区,指针变量存放在栈区
(3)对象方法保存在什么地方?
答:代码区
(4)为什么使用 [p run]; 就可以调用方法了 ?如何调用的?
答:首先找到P对应的堆区空间首先找p对应的堆区的空间,然后找到 _isa指针,再找到_isa指向的代码区的空间,然后到该空间中找方法
|