OC语言day01-11对象的内存存储细节

pragma mark 对象的内存存储细节

pragma mark 概念

pragma mark 代码

#import <Foundation/Foundation.h>
/**
 要求定义一个人类
 事物的名称: 人
 属性: 年龄(age)、身高(height)、体重(weight)
 行为: 吃饭(eat)、睡觉(sleep)、散步(walk)
 Xcode Debug
 */
@interface Person : NSObject
{
    @public
    // 属性
    int _age;
    double _height;
    double _weight;
}
// 行为
- (void)eat:(char *)food;
- (void)sleep;
- (void)walk;
+ (void)demo;
@end

@implementation Person

- (void)eat:(char *)food
{
    NSLog(@"吃%s",food);
}
- (void)sleep
{
    NSLog(@"开始睡觉");
}
- (void)walk
{
    NSLog(@"开始遛狗");
}

+ (void)demo
{
    NSLog(@"demo");
}
@end

int main(int argc, const char * argv[])
{
#warning 要求定义一个人类
    // 1.通过类创建对象
    /*
     1. 开辟存储空间
     2. 初始化所有属性
     3. 返回指针地址
     
     创建对象的时候 返回的地址 其实就是类的 第0个属性的地址
     但是 需要注意的是 : 类的第0个属性 并不是我们编写的_age, 而是一个叫做 isa的属性
     isa 是一个指针, 占8个字节 (指向 当前对象(p) 所属的类(Person) )        `` Person *p = [Person new];
     
     其实类 也是一个对象, 也就意味着Person 也是一个对象
     平时我们所说的 创建对象 其实就是通过 类对象 来创建一个 新的对象(实例对象)
     类对象是系统自动 帮我们创建的, 里面保存了当前对象的所有方法
     而实例对象 是程序员 手动通过new来创建的, 而实例对象 中有一个isa指针 就指向了创建它的那个类对象
     
     */
    
    Person *p = [Person new];
    p->_age = 24;
    p->_height = 170;
    p->_weight = 80;
    
    NSLog(@"age = %i, height = %f, weight = %f",p->_age,p->_height,p->_weight);
    [p walk];   // 走了3步  1、先从栈找到 实例对象地址 2、通过栈的对象地址,在实例对象找到 isa指针 3、通过isa指针 知道类对象的方法 walk
    [Person demo]; // 只走了1步 1、直接到类对象里面查找
//    NSLog(@"p = %p",p);// 0x100600110
//    NSLog(@"&age = %p",&(p->_age));//0x100600118
    
    Person *p2 = [Person new];
    p->_age = 30;
    p->_height = 177;
    p->_weight = 100;
#warning test
    /*
    struct Person
    {
        int age;
        char *name;
    };
    
    struct Person sp;
    NSLog(@"&sp = %p",&sp);
    NSLog(@"&age = %p",&sp.age);
     */
    return 0;
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容