Указатели, NSMutableArray, Retain, Loops и путаница - PullRequest
2 голосов
/ 15 февраля 2010

Возможно, проблема в том, что проблема прямолинейна, но я не разбираюсь в этом.

У меня есть следующий код 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], приложение всегда падает. Зачем? (Кстати, цикл работает несколько тысяч раз)

Есть ли более эффективный способ сделать это?

Я думаю, что предоставил достаточно кода, дайте мне знать, если нет!

Спасибо огромное за вашу помощь!

Ответы [ 3 ]

5 голосов
/ 15 февраля 2010

Объект, который вы создаете в этой строке (и предположительно пытаетесь освободить):

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

немедленно просачивается, когда вы назначаете f объекту, который вы получаете из массива:

f = [allFriends objectAtIndex:x];

Так что на самом деле этот объект, который вы выпускаете, означает, что указатель в массиве больше не действителен (он указывает на освобожденный экземпляр).

4 голосов
/ 15 февраля 2010

Я думаю, у вашего кода есть серьезные проблемы:

  1. Почему вы выделяете новый Friend, если собираетесь немедленно его утечь?
  2. Зачем заменять объект в массиве тем же объектом?

Я думаю, вы можете заменить свой код следующим циклом:

for (Friend *f in allFriends)
{
    if([uid isEqualToString:[f uid]])
    {
        [f AddAlbum:album];
    }
}
1 голос
/ 15 февраля 2010

Похоже, вы делаете намного больше работы, чем вам нужно. Нечто подобное (я думаю) делает то же самое, но без утечек или сбоев:

for (Friend* f in allFriends) {
  if ([uid isEqualToString:[f uid]]) {
    [f addAlbum:album];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...