【问题标题】:weak property objective c memory management弱属性目标c内存管理
【发布时间】:2017-05-12 04:23:39
【问题描述】:

我有一个 NSString 属性较弱的视图控制器

@property (nonatomic, weak) NSString *weakString;

在 viewDidLoad 我初始化如下

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _weakString = @"i am weak";
}

据我了解,weak 属性可能会在任何时候被释放,这样声明具有 weak 属性的属性是否安全? 当我这样做时,

 _weakString = [NSString alloc]init];

编译器警告我将保留对象分配给弱变量,分配后对象将被释放。为什么编译器会给出这个警告?以及为什么编译器在将字符串文字分配给我的弱 NSString 属性时不发出警告。任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ios memory


    【解决方案1】:

    保留属性: strong - 保留,释放旧值并分配 -retain 指定应发送新值 -retain 分配时发送旧值 -release -retain 是一样强。 -apple 说如果你写保留它只会自动转换/像强一样工作。 - 像“alloc”这样的方法包括一个隐含的“retain”

    使用 Wea​​k 属性时: 唯一要使用weak 的情况是,如果您想避免保留循环(例如,父母保留孩子,孩子保留父母,所以两者都不是发布)。

    你不能像这样保留弱属性, _weakString = [NSString alloc]init]; 你必须使用强大的属性。

    如果你想释放内存,你可以nil你的变量。

    【讨论】:

    • 感谢 dahiya ..但是在 viewDidLoad 中将保留对象分配给弱属性后,我已经在 ViewDidAppear 中记录了 _weakString 但未释放 _weakString .. 其背后的原因是什么?
    • 没找到你。请解释您的查询。
    • 根据编译器警告,将保留的对象 ([NSString alloc]init]) 分配给弱属性会导致对象在分配后被释放。在 viewDidLoad 我已将保留对象分配为 '_weakString = [NSString alloc]init];'但是在 viewDidAppear 中,当我将 _weakString 记录为 ''
    • 按照你_weakString = [NSString alloc]init];这一行释放内存。你完全错了。这一行分配内存。如果您的对象已经在内存中,那么它会重新分配内存。所以使用object = nil 释放属性。在NSstring 中,您可以像object = @"hello back again" 那样分配字符串,现在您的对象在零之后再次在内存中。希望您现在了解这个概念。
    【解决方案2】:

    如果你想为一个对象分配内存,那么你不能使用任何对象的弱引用。

    您可以为特定文件打开或关闭 ARC。如果它在你不能使用保留释放自动释放等...相反你使用强弱属性或__strong __虚弱的 对于变量(默认为 __strong)。强相当于保留,但 ARC 会为您管理发布。

    你唯一想使用weak的时候,是你想避免保留循环(例如,父母保留孩子,孩子保留父母,所以两者都不会被释放)。

    “免费桥接”部分(从 NS 转换为 CF)有点棘手。您仍然需要手动管理 CF 对象的 CFRelease() 和 CFRetain()。当你将它们转换回 NS 对象时,你必须告诉编译器保留计数,以便它知道你做了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2017-05-19
      相关资源
      最近更新 更多