文档章节

第01天OC语言(11):对象的内存存储细节

lyh2017iOS
 lyh2017iOS
发布于 2017/07/11 00:04
字数 503
阅读 1
收藏 0

#####一、概念 #####二、代码


#import <Foundation/Foundation.h>
#pragma mark 类
/*
 要求定义一个人类
 事物的名称    : 人(Person)
 属性         : 年龄(age),身高(height),体重(weight)
 行为         : 吃饭(eat),睡觉(sleep),散步(walk)
 */
@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

#pragma mark main函数
int main(int argc, const char * argv[])
{
    
    // 1.通过类创建对象
    
    /*
     1.开辟存储空间, 通过new方法创建对象 会在 堆 内存中开辟一块存储空间
     2.初始化所有属性
     3.返回指针地址
     
     创建对象的时候 返回的地址 其实就是类的第0个属性的地址
     但是 需要注意的是 : 类的第0个属性 并不是我们编写的 _age, 而是一个叫做isa的属性
     isa 是一个指针, 占8个字节
     
     其实类也是一个对象, 也就意味着 Person 也是一个对象
     平时 我们所说的创建对象 其实就是通过一个 类对象 来创建一个 新的对象
     类对象 是系统自动帮我们创建的,里面保存了当前 对象的所有方法
     而,实例对象是程序员 手动通过new来创建的,而实例对象 有一个isa指针 就指向了 创建它的那个类对象
     */
    
    Person *p = [Person new];
    p->_age = 25;
    p->_height = 1.71;
    p->_weight = 65;
    NSLog(@"p = %p",p);
    NSLog(@"&age = %p",&(p->_age));
    /*
    p = 0x100102660
    &age = 0x100102668
     */
    NSLog(@"age = %i, height = %f,weight = %f",p->_age,p->_height,p->_weight);
    
    
    [p walk];
    [Person demo];
    
    /*
    struct Person
    {
        int age;
        char *name;
    };
    
    struct Person sp;
    NSLog(@"&sp = %p",&sp);
    NSLog(@"&age = %p",&sp.age);
     */
    
    
    // 每次 new 都会 创建一个新的对象, 分配一块新的存储空间
    // 如果 修改A的属性 不会影响到 B的属性
    // 一个类 可以创建多个对象
    Person *p2 = [Person new];
    p2->_age = 33;
    p2->_height = 1.73;
    p2->_weight = 68;

    return 0;
}

image.png

© 著作权归作者所有

共有 人打赏支持
lyh2017iOS
粉丝 1
博文 357
码字总数 137380
作品 0
朝阳
Effective objective-C 读书笔记 (第一部分)

第1章 熟悉Objective-C 第1条 了解Objective-C语言的起源 Objective-C是一种“消息结构”的语言,而非“函数调用”语言。 关键区别在于:使用消息结构的语言,其运行时所执行的代码由运行环境...

shenglanya
2017/12/05
0
0
OC . 语法

一、点语法作用 1、方便其他语言程序员很快转到OC开发 2、程序设计简单化 3、隐藏了内存管理细节 4、隐藏多线程、同步、加锁细节 当然是使用点语法 . 还是实用中括号的方式 [** **],随个人喜...

Cy_Star
2017/10/17
0
0
Swift4.0基础知识回顾

简单介绍一下Swift Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序,Swift语言让应用开发更简单、更快、更稳定,确保最终应用有着更好的质量更多了解Swift可以去《The...

博行天下
2017/12/06
0
0
C/OC/Swift的数据类型没那么简单

数据类型决定了值如何存储到计算机内存中。在声明变量时也可指定它的数据类型。不同数据类型来存储不同的信息,所有变量都具有数据类型,以决定能够存储哪种数据。 C语言 C语言的基本数据类型...

CoderDancer
2017/08/10
0
0
OC基础学习:对象在内存中是如何存储的?

例: 会在栈内存中申请一块空间,在栈内存中声明1个Person类型的指针变量p1。p1是一个指针变量,那么只能存储地址。 真正在内存中创建对象的其实是这句代码。 new方法在堆内存中创建一块合适...

Andy_Ron
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高三暑假我是怎么想开去学linux系统的

高三的时候,我有一句口头禅:“老了老了,现在做题越来越迟钝了”。当时整天日夜苦读,体重日益增加,脸色越来越黯淡,我在终于熬过了高考的时候,简直心里面乐得开了花。我终于可以去做自己...

linuxprobe16
23分钟前
0
0
Python 获得命令行参数的方法

需要模块:sys 参数个数:len(sys.argv) 脚本名: sys.argv[0] 参数1: sys.argv[1] 参数2: sys.argv[2]

编程老陆
30分钟前
0
0
链队

队列用链表来表示时,需要用两个变量来记录队列两端的变化:theFront,theBack. 根据链接方向的不同,链队有两种链接方式(其实就是链表的头插入节点和尾插入节点,头删除节点和尾删除节点)。...

Frost729
34分钟前
0
0
IDEA toString() json模板

public java.lang.String toString() {java.lang.StringBuilder builder = new java.lang.StringBuilder();#set ($i = 0)#foreach ($member in $members)#if ($i == 0)builder.appen......

Mtok
44分钟前
0
0
Dubbo内核实现之SPI简单介绍

Dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下), jdk通过ServiceLo...

明理萝
49分钟前
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部