2010-02-15 2 views
2

Возможно, проблема проста, но я не обнимаю ее.Указатели, NSMutableArray, Retain, Loops and Confusion

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

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

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

Спасибо за кучи за вашу помощь!

+0

Спасибо всем! Изменил его, и теперь он работает! – alex25

ответ

4

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

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

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

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

Взял ответ прямо из моего рта: P – Jasarien

5

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

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

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

f = [allFriends objectAtIndex:x]; 

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

1

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

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

Предполагая, что эти UID уникальны, также добавьте 'break' после вызова' addAlbum'. –

+0

St3fan благодарит за маленький намек, делает это намного быстрее! – alex25