【问题标题】:NSMutableArray: Memory management while calling methodsNSMutableArray:调用方法时的内存管理
【发布时间】:2012-03-16 07:20:47
【问题描述】:

在我的 iOS 应用程序中,我使用了一个名为 imageMArray 的 NSMutableArray。我已经设置了它的 getter 和 setter 属性并实例化了它。

在 viewDidLoad 中:

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
imageMArray=[self shuffleOnlyArray:imageMArray];

在 ShuffleOnlyArray 方法中:

 NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
return destArray1;

随机播放方法:

imageMArray=[[self shuffleOnlyArray:imageMArray] retain];

Shuffle 方法中似乎存在内存泄漏。

我应该释放 imageMArray 还是将其设置为 nil?如果应该释放,是否应该自动释放?

【问题讨论】:

    标签: iphone objective-c ios xcode cocoa-touch


    【解决方案1】:
    imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages];
    

    在上面的语句中,你有一个内存泄漏。 相反,您可以如下所示。

    imageMArray = [NSMutableArray arrayWithArray:CategoryImages];
    

    在 ShuffleOnlyArray 方法中,返回自动释放的对象。

    NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ;
    return [destArray1 autorelease];
    

    但是在你得到它之后,保留(取得所有权)这个数组对象。

    imageMArray=[[self shuffleOnlyArray:imageMArray] retain];
    

    编辑

    shuffle方法中,执行如下操作:

    NSMutableArray *imageMArray1 = [imageMArray mutableCopy];
    if( imageMArray )
    {
       [imageMArray release];
    }
    imageMArray=[[self shuffleOnlyArray:imageMArray1] retain];
    [imageMArray1 release];
    

    编辑 2: 另一种解决方案:

    使用SO link中提到的类别随机播放

    无需新建和释放数组。

    【讨论】:

    • 真的有必要吗!!是的你是对的。因为第一次我只是自动释放 destArray。不保留它会导致崩溃。
    • @Adhira:我已经设置了属性和综合然后我还需要编写保留,否则它将包含自动释放的对象......
    • 你给他写代码就好了。但是如果他能理解为什么代码是你写的而不是他做的,那也很好。
    • @ArpitParekh,在shuffle 方法中保留另一个数组之前,我正在释放之前保留的数组。查看我的编辑。
    • 但是如果我释放它,我怎么能用它再次洗牌..!!?
    【解决方案2】:

    1 您在以下几行中已经存在内存泄漏。

    imageMArray = [[NSMutableArray alloc] initWithArray:CategoryImages];

    imageMArray = [self shuffleOnlyArray:imageMArray];
    

    在第一行中,您创建了一个保留计数为 1 的对象。 然后你说你的 imageMArray 指针指向其他对象。你应该释放第一个对象,因为你对第一个对象的引用很糟糕,并且在更改引用后无法释放它!

    2 你不应该使用retain,因为你的ShuffleOnlyArray 方法返回一个retained 对象。 你的工厂方法应该返回一个自动释放对象,工厂的调用者应该决定是否保留它。

    希望我足够清楚

    【讨论】:

    • 嘿,但是我应该什么时候释放数组,因为该方法包含相同的数组
    • 当我更改参考时,我应该在哪里释放它。
    • 您可以像 Aadhira 那样使阵列自动释放,或者您只需调用。 [imageMArray 发布];然后 imageMarray = [self shuffleOnlyArray:imageMArray];。并记住 shuffleOnlyArray 必须返回自动释放,你必须像 Aadhira 那样保留 imageMArray=[[self shuffleOnlyArray:imageMArray] retain];
    猜你喜欢
    • 2011-10-13
    • 2011-09-06
    • 2010-10-02
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多