2011-12-30 1 views
0

Можно создать дубликат:
NSString retain Countосновы NSString Разъяснение

Я новичок для программирования iPhone. Я имею дело с NSString. Я получил объяснение, объясненное ниже.

@implementation Sample; 

NSString *str; 

-(void)viewDidLoad 
{ 
    str = [[NSString alloc] initWithString:@"Hello"]; 

    // Why retain count is some random value? (Eg.2147234) 
    NSLog(@"retain count of string %d",[str retainCount]); 

    [str release]; 
} 

-(void)printString 
{ 
    // Why the value for "str" getting printed here, 
    // though its released in viewDidLoad? 
    NSLog(@"string is %@",str); 
} 

ответ

3
  1. Не смотрите на retainCount. Это смутит вас, и это не поможет.

  2. Константные строки строятся прямо в коде - они никогда не выделяются и не отпускаются. Это нормально для вас, чтобы сохранить и освободить их, как и любой другой объект, но не ожидайте, что постоянная строка будет освобождена в любой момент.

0

В объекте-c метод init не обязательно возвращает тот же объект, созданный с помощью alloc. Он может освобождать себя, а затем возвращать другой объект.

В случае initWithString есть хороший шанс, что он возвращает постоянный строковый объект @ «Hello» вместо инициализации новой строки, поскольку он быстрее и не имеет отрицательных побочных эффектов (обе строки неизменяемы).

Как сказал @Caleb, нормальные правила управления памятью не применяются к постоянным строкам. Вы не можете его отпустить, он всегда будет там.

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

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

Или даже лучше, просто включите ARC и забудьте обо всех этих вещах.

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