Вопрос о количестве ссылок этого кода - PullRequest
0 голосов
/ 25 ноября 2010

В приведенном ниже коде аргументы имеют счетчик ссылок 3 (показанный NSLog) ... я хотел бы понять, почему ... Я пытаюсь управлять памятью здесь и сталкиваюсь с некоторыми фундаментальными недоразумениями ... Кажется, что каждый раз, когда объект ссылается в коде, счетчик ссылок увеличивается, однако в этом случае на аргументы ссылаются только один раз (кроме распределения), и поэтому я могу полагать, что счетчик ссылок должен быть только 2. Во всяком случае ... может кто-нибудь объяснить мне, почему аргументы имеют retainCount 3?

NSString *authToken = [[NSDictionary dictionaryWithContentsOfFile:[GetFilePath pathForFile]] objectForKey: @"auth_token"];
NSString *apiSig = [MD5Gen returnMD5Hash:[NSString stringWithFormat:@"xxxxxxx%@", authToken]];
NSString *arguments = [[NSString alloc] initWithFormat:@"xxxxxxxx%@%@", authToken, apiSig];
NSString *encodedArguments = [arguments stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSURL *url = [[NSURL alloc] initWithString: encodedArguments];
NSLog(@"%i", [arguments retainCount]);

Ответы [ 3 ]

4 голосов
/ 25 ноября 2010

(так как Дэйв попросил об этом)

Не использовать -retainCount.

Абсолютный счет удержания объекта не имеет смысла.

Вы должны вызывать release ровно столько раз, сколько вы вызывали сохранение объекта. Не меньше (если вам не нравятся утечки) и, конечно же, не больше (если вам не нравятся сбои).

Подробнее см. Рекомендации по управлению памятью .

<Ч />

В этом конкретном случае счет сохранения может быть увеличен на stringByAddingPercentEscapesUsingEncoding:, как во внутренних деталях реализации.

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

3 голосов
/ 25 ноября 2010

retainCount довольно бесполезен, так как возвращает бессмысленное число и почти никогда не должен использоваться для целей отладки. На мой взгляд, это просто не рекомендуется: -)

0 голосов
/ 25 ноября 2010

Вы не должны когда-либо использовать retainCount - причина номер один в том, что многие методы возвращают сохраненные + автоматически освобожденные объекты, что означает, что их retainCount будет на единицу выше при каждом извлечении объекта ( до тех пор, пока не будет слит автозапуск).

Это бесполезно для вас, и, вероятно, это не должен быть публичный метод на NSObject, поскольку он не служит и не используется (за исключением частного кода Apple), за исключением того, что вводит в заблуждение новичков, которые пытаются изучить какао /Objective-C.

Чтобы разобраться с управлением памятью в Obj-C, прочитайте руководство по управлению памятью Apple: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

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