【问题标题】:How to manage memory management in iOS如何在 iOS 中管理内存管理
【发布时间】:2013-07-18 07:04:50
【问题描述】:

我需要澄清内存管理概念。

我在.h中声明了一个变量

    @interface RootViewController : UIViewController
    {
         NSMutableArray *objMutableArray;
    }
    @property (nonatomic,retain)   NSMutableArray *objMutableArray;

在 .m 文件中

    @implementation RootViewController

    @synthesize objMutableArray=_objMutableArray;

    - (void)viewDidload
    {
         [super viewDidload];

         self.objMutableArray=[[NSMutableArray alloc]init];

        [self.objMutableArray addObject:@"FirstRow"];
        [self.objMutableArray addObject:@"SecondRow"];
        [self.objMutableArray addObject:@"ThirdRow"];
        [self.objMutableArray addObject:@"FourthRow"];
        [self.objMutableArray addObject:@"FifthRow"];
    }

我在所有地方都使用了 self.objMutableArray。但是当我为该实例释放内存时,我使用了 _objMutableArray。

    - (void)dealloc
    {
         [_objMutableArray release];
         [super dealloc];
    }

实际上,当我为该实例释放内存时,我感到很困惑。请告诉我我做对了,否则我必须释放“objMutableArray”对象。

【问题讨论】:

  • 元元元?内存管理管理?还是只想问“如何管理内存”?
  • 我需要在上述情况下澄清,哪些对象内存将在释放时释放
  • @PartiallyFinite 让他使用他想使用的任何技术。你看,他想了解手动内存管理。 很高兴初学者想了解手动内存管理。
  • @PartiallyFinite 完全正确。更好的是,一个人应该先学习 C,然后才能继续学习 Objective-C 和 iOS。

标签: iphone ios memory-management


【解决方案1】:

您似乎在使用手动内存管理而不是 ARC。这很好,但你弄错了。

请告诉我我做对了,否则我必须释放“objMutableArray”对象。

当然,您必须发布它,因为您使用alloc 创建它。但是你怎么做的不正确。您正在泄漏内存,因为在 viewDidUnload 方法中(我想应该是 viewDidLoad,不是吗!?)您分配给 retain 属性 - 您的对象将具有两个引用计数(一个因为+ alloc,一个因为(retain))。

现在,当您在 - dealloc 中释放它时,它的引用计数仍然为 1,因此您的类不会释放它的所有权,从而导致内存泄漏。

解决方案:

您可以使用属性或实例变量。不要将两者混为一谈。方法一:

_objMutableArray = [[NSMutableArray alloc] init];

// ...

[_objMutableArray release];

方法 #2:

self.objMutableArray = [[[NSMutableArray alloc] init] autorelease];

// ...

self.objMutableArray = nil;

【讨论】:

    【解决方案2】:

    检查你的代码

    1) 你的意思是 viewDidLoad 而不是 viewDidUnload

    - (void)viewDidLoad
    {
         [super viewDidLoad];
    
         self.objMutableArray=[[NSMutableArray alloc]init];
         ......
         ......
    
    }
    

    2) 你不需要分配/初始化,因为你保留了数组

    使用

    self.objMutableArray = [NSMutableArray array];
    

    而不是

    self.objMutableArray=[[NSMutableArray alloc]init];
    

    3) 现在你的实际问题是在 dealloc 中释放时

    我想这个问题是already answered

    【讨论】:

    • 谢谢克里希纳,我的实际问题是当我为 objMutableArray 对象编写合成时,我声明了 _objMutableArray。我用自己。对象可变数组。现在我应该释放哪个对象内存
    【解决方案3】:

    这个viewDidUnload 不应该是viewDidLoad。既然你已经写了@synthesize objMutableArray=_objMutableArray;,那么从那里开始如果你想直接访问这个属性而不使用setter 和getter。您必须使用_objMutableArray。 dealloc [_objMutableArray release]; 中的那一行会将对象的保留计数减一,这样如果所得的保留计数为 0,则该对象将被释放。

    【讨论】:

      【解决方案4】:

      您可以阅读这篇文章以更好地了解内存管理。

      http://www.knowstack.com/objective-c-memory-management/

      【讨论】:

      • 请不要只发布链接。如果页面有相关信息,请使用它来构建答案并使用链接作为参考。谢谢。
      • @Nik 链接将来可能会/也可能不会起作用。所以在这里堆栈溢出压力是尽可能避免链接。请编辑您的答案并将其替换为您认为可以帮助该人解决问题的链接中的内容。我不会对您的答案投反对票,但如果您只是在答案上粘贴链接,其他人会在堆栈溢出中对您的答案投反对票。在您的答案结束时,您可以随时添加链接,说明如果您需要更多信息,请访问此链接。这是可以接受的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2012-01-10
      • 2023-03-14
      • 1970-01-01
      • 2013-06-15
      相关资源
      最近更新 更多