2012-07-10 2 views
1

В чем разница между NSString и NSURL на __weak?Различное поведение __weak на NSURL и NSString

Мой пример:

__weak NSURL *myURL = [NSURL fileURLWithPath:@"/tmp"]; 
__weak NSString *myString = @"123"; 

NSLog(@"myURL: %@", myURL); 
NSLog(@"myString: %@", myString); 

Результат:

2012-07-10 19: 23: 49,858 MYAPP [56093: 303] myURL: (нуль)

2012-07-10 19: 23: 49.859 myApp [56093: 303] myString: 123

Почему это не результат туЗЬптд == (нуль)

+0

Я поместил один и тот же код в основную функцию и напечатал значения ... –

ответ

6

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

Если бы вы создали строку, используя [NSString stringWithFormat:@"hello"];, тогда вы увидите ожидаемое поведение.

+0

Строго, '[NSStrign stringWithFormat: @" hello "];' все равно может возвращать литералную строку, но принцип того, что вы говорите звук - с достаточно длинной строкой формата вы получите новый, бессмертный объект. –

+0

существует разница между нулевым значением и указанием на выпущенную память. –

+0

@InderKumarRathore: Один из модных битов ARC заключается в том, что он автоматически устанавливает слабые ссылки на 'nil', когда объект выпущен. Вот что здесь произошло. –

-1

Попробуйте

NSLog (@ "myURL:% @", [описание myURL]);

NSLog (@ "myString:% @", myString);

Поскольку «% @» используется для представления NSString, а не NSURL.

+1

'NSLog()' отправляет 'description' объекту строки формата'% @ '. Нет необходимости отправлять его вручную - '% @' работает для любого объекта Cocoa. –

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