2016-06-23 2 views
0

У меня есть некоторые тесты о подсчете ссылок Mannul в Objective-C. я бег этого код ниже:Множество проблем, связанных с NSString Количество ссылок

- (void) test { 
    NSData *a1 = [[NSData alloc] init]; 
    NSLog(@"NSData: %lu", [a1 retainCount]); 

    NSMutableData *a2 = [[NSMutableData alloc] init]; 
    NSLog(@"NSMutableData: %lu", [a2 retainCount]); 

    NSObject *a3 = [[NSObject alloc] init]; 
    NSLog(@"NSObject: %lu", [a3 retainCount]); 

    NSString *b1 = [[NSString alloc] initWithFormat: @"%@", @"ok"]; 
    NSLog(@"NSString: %lu", [b1 retainCount]); 


    NSString *b2 = [[NSString alloc] initWithFormat: @"%@", a3]; 
    NSLog(@"NSStinrg: %lu", [b2 retainCount]); 


    NSString *a = @"abc"; 
    NSString *b = @"abc"; 
    NSLog(@"%p", a); 
    NSLog(@"%p", b); 

} 

Консоль:

2016-06-23 16:15:50.490 text[38147:3406036] NSData: 18446744073709551615 
2016-06-23 16:15:50.491 text[38147:3406036] NSMutableData: 1 
2016-06-23 16:15:50.491 text[38147:3406036] NSObject: 1 
2016-06-23 16:15:50.491 text[38147:3406036] NSString: 18446744073709551615 
2016-06-23 16:15:50.491 text[38147:3406036] NSStinrg: 1 
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160 
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160 

И я хочу знать, почему число ссылок на NSData и NSString являются UINT_MAX (-1), и initWithFormat сделает b2 добавить рассчитывать? Почему адресаты a и b такие же?

Thx много.

+2

[Когда использовать -retainCount?] (Http://sdarlington.github.io) – vikingosegundo

+0

@vikingosegundo haha, вы дошли до меня. – Fogmeister

ответ

2

Пустые неизменные NSDatas уникальны для одного экземпляра, который не может быть сохранен или выпущен (указывается с помощью пересчета UINT_MAX-1). Для NSString один,% @ заменяется результатом вызова -description на объекте, а метод -description NSString возвращает self. Таким образом, вы получаете постоянный литерал NSString, который аналогичным образом не может быть сохранен или выпущен. Константные строки также уникальны, поэтому во время компиляции встроен в ваш двоичный файл, и никаких ассигнований не производится.

+0

Пожалуйста, не спам несвязанные вопросы –

+0

Так '' '' '' '' '' 'и встроен в двоичное время компиляции. И в это время компилятор может сравнивать 'a' с' b', чтобы судить о том, равны ли они? Таким образом, они разделяют один адрес? –

+0

@Desgard_Duan: Objective-C делает много и много вещей, чтобы сэкономить память. Включая объекты, где указатель является самим объектом. – gnasher729

2

С apple docs

- (NSUInteger)retainCount 

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

 Смежные вопросы

  • Нет связанных вопросов^_^