2012-05-18 6 views
0

В старомодном смысле это означает, что свойство autoreleased сохраняет свойство. Что произойдет, если это произойдет, что-то вроде следующего.Что произойдет, если назначить слабое свойство сильному свойству?

@property(strong, nonatomic) NSString *new; 

... 

NSString *old = [NSString stringWithFormat:@"%@ %@"), @"hello", @"world"]; 
new = old; 
+1

Затем этот экземпляр получил один раз, период. Кстати, в вашем примере «старый» по-прежнему является сильным экземпляром, и по умолчанию экземпляр объекта является сильным. – ZhangChn

+0

ОК. любой пример для слабого объекта? – tom

+0

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

ответ

1

добавить в свой комментарий на ваш вопрос:

читать эту

Variable Qualifiers

Он описывает различные типы пожизненных классификаторов вы можете объявить переменные и дает примеры каждого из них.

Редактировать с соответствующими битами:

В прижизненные отборочные вы можете использовать следующие:

__strong

__weak

__unsafe_unretained

__autoreleasing

Их описания в документации, но я пойду в первый 2.

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

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

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

Пример код из документации:

NSString * __weak string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]]; 
NSLog(@"string: %@", string); 

Значение string будет аннулировано при попытке напечатать его в этом случае.

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