【问题标题】:Pointers, NSMutableArray, Retain, Loops and Confusion指针、NSMutableArray、保留、循环和混淆
【发布时间】:2010-02-15 17:32:44
【问题描述】:

问题可能是直截了当的,但我不明白。

我有以下 iPhone 代码

for(int x = 0 ; x < [allFriends count] ; x++)   
{
    Friend *f = [[Friend alloc] init];          
    f = [allFriends objectAtIndex:x];

    if([uid isEqualToString:[f uid]])
    {                                           
        [f AddAlbum:album];
        [allFriends replaceObjectAtIndex:x withObject:f];
     }                              
}

无论我在哪里调用 [f release],应用程序总是崩溃。为什么? (顺便说一句,循环运行了几千次)

有没有更有效的方法?

我想我提供了足够的代码,如果没有,请告诉我!

非常感谢您的帮助!

【问题讨论】:

  • 谢谢大家!更改了它,它现在可以工作了!

标签: iphone objective-c arrays pointers


【解决方案1】:

您在此行中创建的对象(并且可能正在尝试释放):

Friend *f = [[Friend alloc] init];

当您将f 分配给您从数组中取出的对象时立即泄露:

f = [allFriends objectAtIndex:x];

所以它确实是那个你要释放的对象,这意味着数组中的指针不再有效(它指向一个释放的实例)。

【讨论】:

    【解决方案2】:

    我认为你的代码有一些严重的问题:

    1. 如果要立即泄露它,为什么要分配一个新的Friend
    2. 为什么要用相同的对象替换数组中的对象?

    我认为你可以用这个循环替换你的代码:

    for (Friend *f in allFriends)
    {
        if([uid isEqualToString:[f uid]])
        {
            [f AddAlbum:album];
        }
    }
    

    【讨论】:

      【解决方案3】:

      看起来你做的工作比你需要的多。像这样的东西(我认为)做同样的事情,但没有泄漏或崩溃:

      for (Friend* f in allFriends) {
        if ([uid isEqualToString:[f uid]]) {
          [f addAlbum:album];
        }
      }
      

      【讨论】:

      • 假设这些 UID 是唯一的,还要在 addAlbum 调用之后添加一个 break
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2011-09-04
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多