Разница между сохранением

#objective-c #memory #nsstring #memory-management #retain

#objective-c #память #nsstring #управление памятью #сохранить

Вопрос:

в чем разница между этими сохранениями?:

 @property (nonatomic, retain) NSString *A_StringToRetain;
  

и

 NSString *B_StringToRetain;
B_StringToRetain = [[MyClass GetStringValue] retain];
  

Поскольку при использовании property строка не сохраняется и при использовании вторых способов, все в порядке, но мне нужно проверить и освободить, чтобы избежать утечек.


Пример:
я объявил в .h

 NSString *A_StringToRetain;
@property (nonatomic, retain) NSString *A_StringToRetain;
  

в .m я использую

 A_StringToRetain = @"MyValue";
  

но когда я выхожу из метода, я проиграл A_StringToRetain . Это зомби.

Если я не использую свойство и не объявляю строку таким образом

 NSString *B_StringToRetain;
B_StringToRetain = [[MyClass GetStringValue] retain];
  

строка находится в памяти.


Кто-нибудь скажет мне, пожалуйста, почему?
Это не тот же способ выделения / сохранения?
В чем различия?

Спасибо.

Ответ №1:

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

 self.A_StringToRetain = someString;
  

или

 [self setA_StringToRetain:someString];
  

Ключевым моментом здесь является self. , что означает, что вы переходите через свойство, а не непосредственно к самому ivar.

Комментарии:

1. Отлично! Я тупой! 🙂 Теперь это понятно и, очевидно, работает! Спасибо.