【问题标题】:Strong and Weak attribute in iOS clarificationiOS 中的强弱属性说明
【发布时间】:2014-05-21 08:34:49
【问题描述】:
NSString *strongObj = [[NSString alloc] init]; //alloc and initialze a new instance
strongObj = @"some value"; //set value to a instance
__weak NSString *weakObj = strongObj; //refer strong pointer to weak obj

strongObj = nil; //set strong object to nil and remove it from memory

strongObj = @"some value 2"; //assign a  different value to strong obj

weakObj ; // weak obj still holds  // @"some value" // this value event i've set the week obj pointer to nil

请看上面的代码和 cmets,这些 cmets 是我的观点/假设。请澄清。

谢谢

【问题讨论】:

  • 弱对象将保留该值,直到其生命周期和范围存在。在范围({ 和 })之后,它将被自动释放并添加到本地或最近的自动释放池。然后它将被释放/释放。
  • 成千上万的骗子可能是:Objective-C ARC: strong vs retain and weak vs assign

标签: ios objective-c memory-management


【解决方案1】:

虽然您正在创建一个strongObj 实例,但实际上您并没有使用相同的实例,而是将指针重新分配给字符串文字@"some value",无论地址是什么。它绝不是您在代码的第一行分配的同一个实例。

现在当您分配weakObj 时,您实际上会将它指向相同的字符串文字@"some value"

基本上发生的情况是weakObj 没有跟随strongObj,而是跟随未释放的字符串文字。这就是为什么当strongObj 已设置为nil 时,您仍会在其中看到“some value”

【讨论】:

    【解决方案2】:

    字符串字面量总是存在的,并且永远不会在运行时被释放。当弱指针指向的内存被释放时,弱指针被取消,所以你错误地期望你的weakObj被取消。

    为了让它工作,你应该使用文字字符串而不是文字字符串

    [[NSString alloc] initWithFormat:@"some value %d", 1];
    

    e。 g.

    NSString *strongObj = [[NSString alloc]  initWithFormat:@"some value %d", 1]; //alloc and initialze a new instance
    __weak NSString *weakObj = strongObj; //refer strong pointer to weak obj
    
    strongObj = nil; //set strong object to nil and remove it from memory
    
    weakObj ; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2014-03-29
      • 2011-12-16
      • 2012-04-09
      • 1970-01-01
      • 2017-04-06
      相关资源
      最近更新 更多