推广

iOS面试题-一个NSObject对象占用多少个字节?

iseeyu2年前 (2024-02-22)推广107

image.png

  • Xcode菜单栏选中Debug -> Debug Workflow -> View Memory

image.png

  • 看到的内存结构如下图所示

image.png

  • 也可以用常用的LLDB指令查看

image.png

  • 看到的打印如下图所示

image.png

总结

  • 一个NSObject对象占用多少字节

回答

  1. 系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
  2. 但是NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数来获取),其实就是isa

扩展到有继承结构的对象

  • Student继承自NSObject
  • 代码结构如下
struct Student_IMPL {
    Class isa;
    int _no;
    int _age;
};


@interface Student : NSObject
{
    @public
    int _no;
    int _age;
}
@end

@implementation Student

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *stu = [[Student alloc] init];
        stu->_no = 4;
        stu->_age = 5;
        
        // 16
        NSLog(@"%zd", class_getInstanceSize([Student class]));
        // 16
        NSLog(@"%zd", malloc_size((__bridge const void *)stu));
        
        struct Student_IMPL *stuImpl = (__bridge struct Student_IMPL *)stu;
        // no is 4, age is 5
        NSLog(@"no is %d, age is %d", stuImpl->_no, stuImpl->_age);
    }
    return 0;
}
  • 大概的内存结构图

image.png

扩展到有多重继承的结构

  • 如下图继承结构
@interface Person: NSObject
{
    int _age;
}
@end

@implementation Person

@end

@interface Student : Person
{
    int _no;
}
@end

@implementation Student

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        // 16
        NSLog(@"person --- %zd", class_getInstanceSize([Student class]));
        // 16
        NSLog(@"person --- %zd", malloc_size((__bridge const void *)person));
        
        Student *stu = [[Student alloc] init];
        // 16
        NSLog(@"stu --- %zd", class_getInstanceSize([Student class]));
        // 16
        NSLog(@"stu --- %zd", malloc_size((__bridge const void *)stu));
    }
    return 0;
}
  • 结构如下

image.png

  • 一个Person对象,一个Student对象占用多少内存空间?
  • 答案是,都是16
  • 大概的内存结构图

image.png

  • 有内存对齐的原因,结构体的大小必须是最大成员大小(16)的倍数

Objective-C不同数据类型占用字节大小

  • 可以通过sizeof来获取不同数据类型占用字节大小
  • sizeof其实不是一个函数,仅仅只是一个操作运算符罢了,编译时就确定了的
类型 32位机器 64位机器
BOOL 1 1
bool 1 1
int 4 4
short 2 2
long 4 8
long long 8 8
NSInteger 4 8
float 4 4
double 8 8
CGFloat 4 8
char 1 1
指针地址 4 8

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56263.html

相关文章

如何优化好一个项目 吸引更多的客户

如何优化好一个项目 吸引更多的客户

seo如何优化好一个是很多人都十分关心的,因为现在网络是非常重要的,而且生活中每一个都会依赖它,下面就由小编和大家一起看一看seo如何优化好一个项目的相关资讯吧。 seo如何优化好一个项目 seo如何优化好一个项目 在前些年工作的时候,有一段时间曾经帮助过一些客户专门做SEO项目管理...

8种提高网站转化率的文案神技能。

8种提高网站转化率的文案神技能。

你的网站内容远比你意识到的更重要。 除了设计外,文案也是品牌的基础。如何描述自己和产品给客户留下了清晰的印象。不管顾客对你品牌的印象是大胆的、未来的、古怪的还是可爱的,很大程度上取决于呈现出来的文案。 网络文案对于传达产品信息也是至关重要的。你的客户想知道你的产品是如何使用的,以及如何...

小编分享多语言网站搭建的必要性。

小编分享多语言网站搭建的必要性。

    我们一起讨论一下,虽然英文是一种火爆的国际性语言,但全世界也有超出6900种别的语言。依据百科,汉语是时兴的语言,次之显示英文,随后是西语,印地语,阿语这些。因此尽管英语很火爆,可是也有很多的别的时兴语言每日都会应用和创作。为何网站搭建公司不可以出示一种简洁明了而合理的方...

注重落地页打开速度就等于提升用户体验友好度。

注重落地页打开速度就等于提升用户体验友好度。

许多会告诉你,如果你需要开始在线营销你的产品或服务,你应该有一个非常好的网站。然后他们中的大多数会神秘地告诉你,即使你有一个好的网站,你也需要一个伟大的登陆页面。当我们开始在搜索引擎上推广您的网站时,我们需要一个设计精美、内容优秀、具有高度挑衅性和高转换率的页面来转换流量。这是业内人士常说的。...

关键词优化的竞争程度应该从哪几方面着手分析。

关键词优化的竞争程度应该从哪几方面着手分析。

在SEO中,关键词选择的质量和合理性直接关系到你的SEO过程的难度,以及在激烈的竞争中能否占据一席之地的关键词因素。优化猩SEO优化平台简论关键词竞争的程度分析: 百度索引是关键词在一定时期内网络曝光和用户关注的结果。 因此,用户搜索关键词的次数可以从百度索引中反映出来。百度指数...

怎么做一个能够吸引蜘蛛的网站结构。

怎么做一个能够吸引蜘蛛的网站结构。

网站的结构框架就像文章的提纲,需要有一定的脉络和逻辑。因为一个优秀的网站框架可以让人一目了然,就像整齐干净有序的房子一样惹人喜爱,最重要的一点就是一个好的网站结构可以吸引百度蜘蛛。那么什么样的网站结构才更吸引蜘蛛呢?根据笔者的实践总结,网站扁平化结构是一个不错的选择。 一般笔者比较经常使用的网站...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片