zoukankan      html  css  js  c++  java
  • ios开发:OC对象的内存分析

       最近要开始准备找实习单位了,做做笔试题,看看各位大神的面试经历,发现自己要学习的东西真的还有很多,虽然也做过几个的项目,但是真正拿过笔试题一看,才发现自己对基础这方面的东西,确实有点忽视了,所以最近开启恶补模式。

       这几天在研究ios内存分析这一块,才发现自己原来忽视了这么多重要的东西,在这里和大家分享一下。

       先来看一段代码:

        

    NSString* s;
    s = [[NSString alloc] initWithString:@"hello ios"];

      这是一段最简单的字符串定义,但是看似简单,其实有很多东西可能会被忽略掉

      1.这里的s其实是个指针,在oc中除了基本数据类型之外的变量类型都是指针类型,oc的对象也是通过指针进行操作的。

      2. 在第一段代码定义了NSString类型的指针变量,但是并没有指向任何对象,第二段代码alloc一个NSString对象  然后使s指向它,并通过s开始其的后续操作。

      3. 这里s的内存空间在栈内存中,“hello ios”在堆内存中。

    下面通过图示说明一下

    再来看一个例子

    @interface C: NSObject
    {
      int a;
      int b;       
    }
    @end
    
    
    int main(int argc, const char *argv[])
    {
      C *c1 = [[C alloc]init];
      C *c2 = [[C alloc]init];      
    }

    内存分布情况

      看到这里大家也就能明白了,oc中创建的对象指针存储在栈内存中,而alloc出来的对象的内存在堆内存中,栈内存中的指针通过赋值指向堆内存中的对象,然后通过栈内存中的指针访问对象及其变量,也就是说,其实我们在创建一个对象时其实是利用了两个部分的内存空间。

      

  • 相关阅读:
    重塑矩阵
    买卖股票
    两个数组的交集
    洛谷 P3700
    HDU 6987
    Solution -「NOI 2021」「洛谷 P7740」机器人游戏
    「NOI 2021」酱油记
    Solution -「UNR #5」「UOJ #671」诡异操作
    CD from Codeforces Round #703 (Div. 2)
    CD from Codeforces Round #701 (Div. 2)
  • 原文地址:https://www.cnblogs.com/zyi1992/p/4378293.html
Copyright © 2011-2022 走看看