Сравнить строку с NSArray - PullRequest
0 голосов
/ 31 мая 2011

У меня есть занятия Checkin и FriendList.

Checkin.h

@interface Checkin : NSObject {

    NSString *name;
    NSString *profID;
    NSString *place;
    NSString *photoURL;
    NSMutableArray *taggedID;
    NSMutableArray *taggedName;

и Friendlist.h

@interface FriendList : NSObject {
    NSString *name;
    NSString *profID;

}

Я пытаюсь сравнить каждый файл checkin.profid (приблизительно 5-6) с friendlist.h (200-5000). Я пытался сделать это с помощью цикла for, но при проверке происходит сбой второго checkin.profid. Это мой метод:

  for(int i=0; i<[checkinArray count];i++){

     Checkin *tempcheck = [[Checkin alloc] init];
     tempcheck = [checkinArray objectAtIndex:i];

     for(int j=0;j<[friendsArray count]; j++){
         NSLog(@"count %d",j);
         FriendList *tempfriend = [[FriendList alloc] init];
         tempfriend  = [friendsArray objectAtIndex:j];

         if([tempcheck.profID isEqualToString:tempfriend.profID]){
             NSLog(@"Find prof id same for : %@",tempcheck.name);
             break;
         }
           else
             NSLog(@"Not found id same for: %@",tempcheck.name);
         [tempfriend release]; 
     }

    [tempcheck release];
   }
}

Есть ли лучший способ сделать это сравнение? Потому что это тоже слишком медленно. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Ваше управление памятью нарушено.Когда вы делаете что-то вроде этого:

 Checkin *tempcheck = [[Checkin alloc] init];
 tempcheck = [checkinArray objectAtIndex:i];

Что вы делаете, это создаете объект, а затем назначаете указатель на объект в массиве регистрации.Это приводит к утечке памяти прямо здесь.

Затем, позже, когда вы делаете:

[tempcheck release];

вы фактически вызываете release для объекта в массиве, а не для того, который вы выделяете 'буду раньше.Предположительно, это приводит к тому, что объект в массиве собирается мусором, а затем, когда вы пытаетесь получить к нему доступ во второй раз, вы получаете сбой.

Удаляет allocs & release и просто делает что-то вроде этого:

Checkin *tempcheck = [checkinArray objectAtIndex:i];
1 голос
/ 31 мая 2011

это не поможет:

Checkin *tempcheck = [[Checkin alloc] init];
     tempcheck = [checkinArray objectAtIndex:i];

И

FriendList *tempfriend = [[FriendList alloc] init];
tempfriend  = [friendsArray objectAtIndex:j];

нет причин выделять их: просто установите его как объект с нужным индексом:

Checkin *tempcheck = [checkinArray objectAtIndex:i];

было бы лучше.Что касается выполнения поиска, почему бы не выполнить циклический просмотр checkins и для каждого checkin.profId создать новый NSPredicate для поиска profId через список друзей.Попробуйте [NSPredicate filterWithFormat: @ "(profId =% @)"];

и затем используйте FilterArrayUsingPredicate для вашего массива.

...