Возвращает выделенный экземпляр NSNumber.
NSNumber *clientId = [[NSNumber alloc] init];
Эта строка перезаписывает вышеуказанный clientId другим экземпляром NSNumber, numberWithInt возвращает объект автоматического освобождения, так как для него не выделена память, вызывать его не следует, он будет освобожден автоматически.
clientId = [NSNumber numberWithInt:thisClient.clientsId];
Вы вызываете release для clientId, поэтому у вас проблема с памятью.
Чтобы исправить это, удалите первую строку выше, которая в данном случае бесполезна, и обновите вторую строку:
NSNumber * clientId = [NSNumber numberWithInt:thisClient.clientsId];
Затем удалите:
[clientId release]
Поскольку clientId будет освобожден автоматически.
РЕДАКТИРОВАТЬ : Re все еще есть проблемы ...
Я не уверен, как вам манипулировать клиентами в делегате приложения, иначе код должен работать нормально, я создал небольшой пример, пропуская части, которые я не вижу (делегат приложения и клиенты):
// утилита командной строки - проект инструмента фундамента:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray * theList = [[NSMutableArray alloc] init];
int i = 0;
for (i = 0; i < 10; ++i)
{
NSString * clientName = [NSString stringWithString:@"client"]; //no need to release
NSNumber * clientId = [NSNumber numberWithInt:i];
NSDictionary * theItem = [NSDictionary dictionaryWithObjectsAndKeys:
clientName, @"name",
clientId, @"id",
nil];
[theList addObject:theItem];
}
for (id item in theList) for (id key in item) NSLog(@"%@ - %@", key, [item objectForKey:key]);
[theList release];
[pool drain];
return 0;
}