Title不重要
  • 初衷
  • 教程
    • Aria2教程
    • Mac重装教程
    • Hexo教程
    • v2ray教程
    • 翻墙教程
    • Flutter教程
    • Cocoapods教程
  • 混合框架
    • 方案一:原生+H5
      • a、Cordova
      • b、Ionic
      • c、微信小程序
    • 方案二:原生+JavaScript
      • a、React Native
      • b、Weex
      • c、快应用
    • 方案三:原生+自绘
      • a、QT for mobile
      • b、Flutter
  • 开发语言
    • Flutter
      • Dart
    • iOS
      • 1、Swift
      • 2、Objective-C
    • Android
      • Java
    • 2、Python
    • 3、JavaScript
    • 4、PHP
    • 5、Go
  • 开发者
    • 开发者个人
      • iOS
    • 开发者团队
      • 滴滴出行团队
      • 携程团队
      • Yelp团队
      • 大众点评-美团点评团队
  • 工具
    • Mac
      • 重装Mac
    • Windows
  • 干货
    • iOS干货
      • 音视频
      • 动画
      • 直播
      • Xcode
      • iOS 网站论坛
      • iOS 开源项目
        • Swift
      • iOS 视图控件
    • 书籍
      • 教育类
    • 其他干货
      • 设计干货
      • 电影网站
      • Telegram资源
    • Java干货
    • Android干货
      • Android 开源项目
  • 集成平台
    • 第三方支付
      • 微信支付
    • 高德地图
      • AMapSearch库
  • SDKS
    • iOS
      • Foundation
        • NSURLSession
  • 互联网概念
    • 后端
      • 黑石物理服务器
      • Redis
      • 360 Pika项目
      • MapReduce
      • Apache Kylin
      • Gears
      • 集群框架Spark
      • ACM国际大学生程序设计竞赛
      • Presto
      • Apache Storm
      • Apache Flink
      • Apache HBase
      • Apache Mesos
      • Apache Hadoop
      • Apache Hive
      • Apache Cassandra
      • LAMP
      • MySQL
      • 概念:微服务
    • 前端
      • iOS
        • 怎么知道一个NSObject对象占用多少内存?
        • Token过期的处理方案
        • 无侵入埋点
        • 电量优化
        • 介绍多线程
        • 介绍消息传递和转发
        • 介绍Runloop
        • 介绍Runtime
        • 介绍深拷贝和浅拷贝
        • 介绍KVO和KVC
        • 自定义的类,如何实现copy
        • 介绍Autorelease对象什么时候释放?
        • 介绍App卡顿
        • 介绍NSCoding协议和NSCopying协议
        • 介绍内存泄漏和内存溢出
        • 介绍Weak和Assign的区别
        • 介绍Delegate为什么用Weak
      • Android
        • Android中startService和bindService的区别
        • Android与vue js互相调用
      • 原理:直播流程
  • 互联网大会
    • QCon全球软件开发大会
    • AICon全球人工智能与机器学习大会
    • ArchSummit全球架构师峰会
    • GMTC全球大前端技术大会
      • 2019 GMTC
    • WWDC全球苹果开发者大会
      • WWDC2019
        • SwiftUI
      • WWDC2017
        • Universal Links
      • WWDC2018
      • WWDC资源
    • 谷歌I/O大会
  • 生活的智慧
    • 权谋学
Powered by GitBook
On this page

Was this helpful?

  1. 互联网概念
  2. 前端
  3. iOS

怎么知道一个NSObject对象占用多少内存?

PreviousiOSNextToken过期的处理方案

Last updated 5 years ago

Was this helpful?

答案:

1.可以通过查看NSObject对象对应的C++结构体的大小来判断。

2.可以使用xcode的命令行工具来把指定的OC文件转成C++文件。

3.对象实际利用的内存大小,就是对象的实例变量占用的内存大小,可以通过调用runtime中的class_getInstanceSize函数得到

4.对象实际占用的内存大小,就是系统实际分配给对象的内存大小,OC对象是通过alloc方法得到的对象大小,我们可以通过malloc中库函数malloc_size来得到结果.

5.这个函数的代码很简单,返回的结果就是系统给一个对象分配内存的大小。当对象的实际大小小于16时,系统就返回16个字节的大小。也就是说16个字节大小是系统的最低消费。还是用坐车的例子来说明一下,假如有8个人想坐车,他们打电话叫车说要一辆能坐8个人大小的车,对方说sorry我们没有坐8个人大小的车,我们这里最小的就是坐16个人的车。最后来了一辆坐16个人的车,拉了8个人开走了。车就好比一个NSOject对象,车上的乘客就好比是对象中的成员,车的大小或者说载客数量就相当于一个对象占用的内存大小,车上实际的乘客数量就是对象中成员的大小。所以说一个NSObject对象占用多少内存,我想应该很明白了。

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *objc = [[NSObject alloc] init];
        
        NSLog(@"objc对象实际需要的内存大小: %zd", class_getInstanceSize([objc class]));
        NSLog(@"objc对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(objc)));
    }
    return 0;
}

//输出的结果
2018-08-02 23:31:39.891056+0800 OC对象的本质[8461:5063635] objc对象实际利用的内存大小: 8
2018-08-02 23:31:39.891320+0800 OC对象的本质[8461:5063635] objc对象实际占用的内存大小: 16
https://www.jianshu.com/p/8829738b94b7