2015-10-14 3 views
0
__weak NSString *string_weak_ = nil; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    @autoreleasepool { 
     NSString *string = [NSString stringWithFormat:@"hello"]; 
     string_weak_ = string; 
    } 
    NSLog(@"string: %@", string_weak_); 
} 

`autoreleasePool отличается от iOS 9?

string: (null) // in iPhone(iOS 8.1) simulator 
string: hello // in iPhone(iOS 9.0) simulator 

я запускаю этот код в iPhone (8.1) и iPhone (9,0) simulator.The результат отличается. Интересно, что случилось?

ответ

0

Оба результата являются разумными. Результат зависит от реализации, в зависимости от того, имеет ли кто-либо ссылку на строковый объект, возвращаемый [NSString stringWithFormat:], или что-то еще, и является ли он вообще объектом с динамическим распределением, а не объектом статически назначенного.

Строковые литералы оценивают указатели на объекты, выделенные статически, которые существуют для времени жизни программы и не управляются памятью путем подсчета ссылок. Некоторые способы, например. [NSString stringWithString:], когда задана неизменяемая строка, просто верните заданную строку и не создайте новый строковый объект в качестве оптимизации.

Здесь используется [NSString stringWithFormat:]. Также возможно просто вернуть данный объект строки формата, в случае, когда это неизменяемая строка и нет спецификаторов формата. Я не тестировал это лично, но, возможно, эта оптимизация была добавлена ​​в [NSString stringWithFormat:] между версиями ОС.

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

+0

но я вижу что-то подобное в своем приложении. Моя печать на ноге памяти очень высока на iOS 9, тогда как на iOS 8 она выглядит нормально (= пул автозапуска работает так, как должен) – Buju

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