Для начала, вы теряете память как сумасшедший. Изучите правила: если вы создаете объект (alloc / init или copy), то вы являетесь его владельцем и должны освободить его.
item = [[[NSMutableDictionary alloc] initWithContentsOfFile:filePath] mutableCopy];
В этой строке вы создаете изменяемый словарь, затем создаете изменчивую его копию, теряя исходный экземпляр. Вы должны заменить это на:
item = [[NSDictionary alloc] initWithContentsOfFile:filePath];
Вы фактически не изменяете словарь в своем коде, поэтому я позволю ему быть NSDictionary.
Далее введите в этом объявлении:
NSMutableArray *ReadStoredArray = [item objectForKey:SearchTerm];
неверно. Даже если словарь изменчив, его члены не гарантированы. (mutableCopy
является мелкой копией.) Поскольку вы фактически не изменяете этот массив, давайте изменим строку на:
NSArray *ReadStoredArray = [item objectForKey:SearchTerm];
Теперь, если вы хотите скопировать элементы из ReadStoredArray в SortedArray, вы можете заменить цикл на
[SortedArray addObjectsFromArray:ReadStoredArray];
Но поскольку вы делаете точную копию, вы также можете просто написать
SortedArray = [ReadStoredArray mutableCopy];
Но вам не нужно, чтобы SortedArray
был изменяемым, поэтому вы можете просто вызвать эту другую форму, которая возвращает новый отсортированный массив, а не сортировать изменяемый массив на месте:
SortedArray = [ReadStoredArray sortedArrayUsingSelector:@selector(compare:)];
Итак, теперь ваша функция выглядит так:
void ListAllStoredLocations(NSString *SearchTerm) {
NSDictionary *item;
NSString* filePath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"/Preferences/yourprogram.plist"];
item = [[NSDictionary alloc] initWithContentsOfFile:filePath];
NSArray *ReadStoredArray = [item objectForKey:SearchTerm];
NSArray *SortedArray = [ReadStoredArray sortedArrayUsingSelector:@selector(compare:)];
for (int i = 0; i< [SortedArray count]; i++){
NSLog(@"%@",[SortedArray objectAtIndex:i]);
}
[item release];
}
Вам не нужно освобождать ReadStoredArray
или SortedArray
, потому что вы не являетесь их владельцем (нет alloc / init или копирования в вызовах).
Что касается вашего фактического вопроса ... в коде нет очевидной причины, по которой сортировка не будет работать. Сожалею! Многие распространенные проблемы вызвали бы исключения, а не тихие сбои.
Если файл не существует или не может быть загружен, initWithContentsOfFile:
вызвало бы исключение. Если ReadStoredArray
равно нулю, то CurrentResult
будет равно нулю, а addObject:
выдаст исключение. Если бы объекты в массиве не отвечали на селектор compare:
, sortUsingSelector:
вызвало бы исключение. Если бы SortedArray
было равно нулю, код молча потерпел бы неудачу, но он также не выводил бы выходные данные. (Кроме того, для того, чтобы он был равен нулю, alloc / init должен был потерпеть неудачу, что означает, что у вас недостаточно памяти.)
Помимо утечек памяти и нетрадиционного стиля (начиная с имен переменных в верхнем регистре), в вашем коде нет ничего плохого. Чего-то не хватает.