如果将弱属性分配给强属性会发生啥?
Posted
技术标签:
【中文标题】如果将弱属性分配给强属性会发生啥?【英文标题】:what will happen if assign a weak property to a strong property?如果将弱属性分配给强属性会发生什么? 【发布时间】:2012-05-18 17:21:39 【问题描述】:在旧术语中,它是关于将自动释放的属性分配给保留属性。如果这样做会发生什么,如下所示。
@property(strong, nonatomic) NSString *new;
...
NSString *old = [NSString stringWithFormat:@"%@ %@"), @"hello", @"world"];
new = old;
【问题讨论】:
然后该实例被保留一次,期间。顺便说一句,在您的示例中,old
仍然是一个强实例,默认情况下,对象实例是强实例。
好的。有弱对象的例子吗?
要使指针变弱,您必须明确声明它。 NSStrings 默认是自动释放的,所以这不是弱指针的实例。如果您确实创建了一个弱指针,它将不会保留它所指向的任何内容。如果只有一个其他指针指向它并被释放,则该对象将被释放,弱指针将悬空。
【参考方案1】:
添加我对您问题的评论:
阅读本文
Variable Qualifiers
它描述了您可以用来声明变量的不同类型的生命周期限定符,并给出了每种类型的示例。
使用相关位进行编辑:
您可以使用的生命周期限定词是:
__强
__弱
__unsafe_unretained
__自动释放
他们的描述在文档中,但我将进入前 2 个。
__strong
是默认类型(当您不指定时),它将对象的保留计数增加 1。只要有指向对象的强指针,它就会保持活动状态。
__weak
不会增加对象的保留计数,也不会使其保持活动状态。如果没有指向同一个对象的强引用,弱指针将自动设置为 nil。 (__unsafe_unretained
实际上与 weak 几乎相同,但它们被悬空而不是被设置为 nil)。
如果你创建一个立即分配给弱指针的对象,它会立即被释放,因为它没有强引用。
来自文档的示例代码:
NSString * __weak string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];
NSLog(@"string: %@", string);
在这种情况下尝试打印string
的值将为空。
只有当你想要引用的对象已经至少有一个强引用时,你才能使用弱指针。否则(新)对象将立即被释放。
【讨论】:
以上是关于如果将弱属性分配给强属性会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
如果我在使用新程序和结束程序分配数据后没有调用删除运算符会发生啥?
如果我重新分配并且新大小为 0,会发生啥情况。这是不是等同于免费?