【问题标题】:Obj-C: Properly releasing allocated objects in loopObj-C:在循环中正确释放分配的对象
【发布时间】:2011-08-19 19:15:47
【问题描述】:

希望我能很好地解释这一点。 假设如下:

@interface ClassA : NSObject {
   NSMutableArray firstArray;
   NSArray secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
   ClassA classAobject;
}

然后在程序“伪代码”的其他部分访问字典键,例如:

NSMutableArray* sample = [[NSMutableArray alloc] init];
for (keys in Data)
{
    ClassA* aObj = [[ClassA alloc] initWith: objectForKey:@"KeyHere" andWith:@"Key2Here"];

    ClassB* bObj = [[ClassB alloc] init];
    [bObj setClassAObj: aObj];

    [sample addObject: bObj];
}
Singleton* single = [Singleton single];
[single setArray: sample];

我的问题是在循环内创建的 ClassA 和 ClassB 对象以及将它们存储在循环外的数组。我是否在这里泄漏内存,而不是释放它们?如果我确实释放了它们,我怎样才能这样做,以免在存储“样本”数组的单例中丢失对它们的引用?

如果重要,存储它的 Singleton 数组会在类的“init”方法中分配和初始化。

【问题讨论】:

  • 请不要为这样的问题发布非编译代码。发布您正在使用的实际代码。基本上不可能说你的内存管理是否正确,因为这段代码部分是荒谬的。它也不是伪代码;伪代码通常与语言和框架无关,并且会忽略 alloc/init 之类的内容。

标签: objective-c memory-management memory-leaks release-management retain


【解决方案1】:

将对象添加到数组会保留对象。所以你需要在添加它们之后释放它们(如果不是自动释放的话)。同样,您需要确保将实例变量数组(在单例中)的@properties 设置为保留,以便在单例中设置时保留示例数组。然后你也需要发布样本。

另外,你的实例变量需要是指针:

@interface ClassA : NSObject {
   NSMutableArray *firstArray;
   NSArray *secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
   ClassA *classAobject;
}

【讨论】:

    【解决方案2】:

    NSMutableArray 在对象被分别添加和删除时执行保留和释放。因此,您为分配获得了一个保留,然后为添加获得了第二个保留。当数组被销毁时,它会释放一个。这使您的保留计数为 1。

    您可以使这些自动释放。我相信将内存一起释放可以提高性能,并且是推荐的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多