文档章节

第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
朝阳
私信 提问
iOS 编写高质量Objective-C代码(二)

《编写高质量OC代码》已经顺利完成一二三四篇! 附上链接: iOS 编写高质量Objective-C代码(一) iOS 编写高质量Objective-C代码(二) iOS 编写高质量Objective-C代码(三) iOS 编写高质量...

MrLiuQ
08/13
0
0
OC . 语法

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

Cy_Star
2017/10/17
0
0
Effective objective-C 读书笔记 (第一部分)

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

shenglanya
2017/12/05
0
0
Swift4.0基础知识回顾

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

博行天下
2017/12/06
0
0
OC底层知识(十二) : 内存管理

一、抛出一个问题:使用、 有什么注意点?1.1-1.6的demo // 保证调用频率和屏幕的刷帧频率一致 60FPSself.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(linkTest)]...

IIronMan
11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 配置边栏

如果你具有空间的管理员权限,你可以对空间的变量进行自定义,让你的空间具有自己的空间标识(logo),修改显示的继承关系和在空间中添加快捷方式以帮助用户在空间中进行快速导航。 希望开始...

honeymose
12分钟前
0
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部