У моего приложения, похоже, 4 утечки памяти (на устройстве, запущенных инструментах).
Утечки памяти происходят из этого кода:
NSURL *url = [self getUrl:destination];
[destination release];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"GET"];
[request addValue:@"application/json" forHTTPHeaderField:@"content-type"];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[request release];
[connection release];
РЕДАКТИРОВАТЬ : добавлен код для getUrl
- (NSURL *)getUrl:(NSString *)actionUrl
{
NSString *rawUri = [[NSString alloc]initWithFormat:@"%@/%@", kBaseUrl, actionUrl];
NSURL *url = [[[NSURL alloc] initWithString:rawUri] autorelease];
[rawUri release];
return url;
}
Я высвобождаю все свои объекты, насколько я могу видеть, но это все еще показывает это как источник 4 утечек памяти.
Это на устройстве под управлением 3.1.3
Допустимо ли иметь несколько утечек памяти в вашем приложении или все они должны быть устранены?
РЕДАКТИРОВАТЬ : Я добавил авто-релиз в getUrl. Однако это все еще обнаруживается с утечками памяти
EDIT2 : поведение довольно странное. Я запускаю приложение и нажимаю кнопку, которая делает этот вызов один раз. 4 утечки обнаружены. Я нажимаю назад и снова нажимаю на кнопку, и продолжаю делать это несколько раз, и все еще только 4 утечки. Однако, если я подожду несколько секунд, а затем нажму кнопку усиления еще несколько раз, обнаруживаются 9 утечек. Это не маленькая 128-байтовая утечка, но на этом этапе она составляет 1,61 КБ.
РЕДАКТИРОВАТЬ3 : Вот соединениеDiFinishLoading
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
SBJSON *jsonParser = [[SBJSON alloc] init];
NSString *jsonString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
[receivedData setLength:0];
[receivedData release];
[self.delegate dataReceived:[jsonParser objectWithString:jsonString]]; // See method below
[jsonParser release];
[jsonString release];
}
Делегат получает данные, затем преобразует их (и, в свою очередь, передает их другому делегату после создания продукта)
- (void)dataReceived:(id)data
{
NSMutableArray *myObjects = [[NSMutableArray alloc]init];
ObjectFactory *objectFactory = [[ObjectFactory alloc]init];
// Only one object
if ([data isKindOfClass:[NSDictionary class]])
{
Object *object = [objectFactory buildObject:data];
[myObjects addObject:object];
[object release];
}
// Multiple objects
if ([data isKindOfClass:[NSArray class]])
{
for (NSDictionary *objectSrc in data)
{
Object *object = [objectFactory buildObject:post];
[myObjects addObject:object];
[object release];
}
}
[objectFactory release];
[self.delegate objectsReceived:myObjects];
}
EDIT4 :
Я заметил, что объект ConnectionObject, содержащий NSUrlConnection, никогда не освобождается.
Я поставил точку останова на dealloc , которая вызывает [освобождение соединения]
Эта сделка никогда не называется. Все раскладки вызываются по цепочке, кроме этой.
Я попытался [соединение отменить] в вызове "connectionDidFinishLoading", чтобы увидеть, помогло ли это, но не помогло вообще.
Для меня это загадка ...