由于引用计数变为0将导致对象被释放。 我很好奇当一个弱对象被释放,因为计数总是0,当我宣布一个弱的时候,我是否需要担心它会被释放一半?
例如
NSObject ClassA
@property (weak) NSString stringA;
- init() {
...
stringA = @"this is a weak string";
...
}
- doSomething() {
// When I call this function later,
// is there any chance at this point stringA has been released?
NSLog(stringA);
}
答案 0 :(得分:0)
如果通过IBOutlet
或delegate
/ datasource
连接,则只会声明弱属性(引用另一个{{1} })。
如果你创建了一个弱属性,它将在实例化后立即释放。但是,通过UIViewController
连接的weak
属性不会释放,因为该视图对该属性有强烈支持。
与VC类型的属性相同,例如IBOutlet
s,它们是delegate
属性,因为您将类分配给属性。风险投资显然是强有力的,因此代表应避免强烈关注风险投资,以防止保留周期(weak
强烈支持a
而b
强烈支持b
)。
因此,要回答您的问题,如果没有任何强烈支持,a
属性将立即释放,以上是您将使用weak
属性的情况
答案 1 :(得分:0)
字符串是一个糟糕的例子。有些物品永远不会被释放。常量字符串,[NSNull null],@ YES和@NO,32位的小NSNumber值和64位空数组中的许多NSNumber值,依此类推。由于它们没有被释放,弱变量永远不会是零。
许多物品都是自动释放的。如果没有别的东西引用它们而不是它们的自动释放池,它们会在游泳池消失时消失。
但是如果使用alloc / init创建一个对象并将其存储在弱变量中,编译器就会知道alloc / init的引用计数为1,该引用计数被删除,并且poof!它去了。如果将引用存储在一个默认为强的局部变量中,则当代码离开局部变量的范围时它会消失。如果你首先存储到弱变量然后从弱变量存储到强变量中,那就太晚了,它已经消失了。