Почему NSString сохраняет счет 2? - PullRequest
4 голосов
/ 26 июля 2011
#define kTestingURL @"192.168.42.179"

...

NSString *serverUrl = [[NSString alloc] initWithString:
                        [NSString stringWithFormat:@"http://%@", kTestingURL]]; 
NSLog(@"retain count: %d",[serverUrl retainCount]);

Почему счет 2, а не 1?

Ответы [ 4 ]

5 голосов
/ 26 июля 2011

Вы не должны заботиться об абсолютном значении счетчика удержания.Это бессмысленно.

Сказал, что посмотрим, что произойдет с этим конкретным случаем.Я немного изменил код и использовал временную переменную для хранения объекта, возвращаемого stringWithFormat, чтобы сделать его более понятным:

NSString *temp = [NSString stringWithFormat:@"http://%@", kTestingURL];
// stringWithFormat: returns an object you do not own, probably autoreleased
NSLog(@"%p retain count: %d", temp, [temp retainCount]);
// prints +1. Even if its autoreleased, its retain count won't be decreased
// until the autorelease pool is drained and when it reaches 0 it will be
// immediately deallocated so don't expect a retain count of 0 just because
// it's autoreleased.
NSString *serverUrl = [[NSString alloc] initWithString:temp];
// initWithString, as it turns out, returns a different object than the one
// that received the message, concretely it retains and returns its argument
// to exploit the fact that NSStrings are immutable.
NSLog(@"%p retain count: %d", serverUrl, [serverUrl retainCount]);
// prints +2. temp and serverUrl addresses are the same.
5 голосов
/ 26 июля 2011

Да, вы получите счетчик 2, один для alloc и другой для stringWithFormat. stringWithFormat - это фабричный класс с авто-релизом, но авто-релиз уменьшает количество сохраняемых данных в будущем.

2 голосов
/ 26 июля 2011

Вы создали строку, а затем использовали ее для создания другой строки.Вместо этого сделайте это:

NSString *SERVER_URL = [NSString stringWithFormat:@"http://%@", kTestingURL];
1 голос
/ 26 июля 2011

это потому, что вы [[alloc] init] первый NSString, чтобы serverUrl сохранил +1, и в той же строке вы вызываете [NSString stringWithFormat], которые возвращают еще одну nsstring в autorelease с сохранением count в 2, вы должны использовать только:

NSString * serverUrl = [NSString stringWithFormat: @ "http://%@", kTestingURL];

, поэтому ваш serverUrl будет иметь retainCount в 1, и вам не нужно освобождатьстрока

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...