【问题标题】:Setting WEAK to a non @property variable将 WEAK 设置为非 @property 变量
【发布时间】:2012-07-05 09:49:18
【问题描述】:
需要了解 ARC 的人来帮助我。
基本上,我已经在我的类中声明了一些变量
@interface Class{
NSString* one;
NSString* two;
}
@property(nonatomic,weak) NSString* one;
如您所见,我可以将弱标识符设置为NSString* one。但是,我不需要 NSString* two 的 getter/setter/synthesizer,因为它只是一个公共变量。如何为其设置weak 标签以便释放内存?还是自动设置?
【问题讨论】:
标签:
objective-c
ios
cocoa-touch
automatic-ref-counting
weak
【解决方案1】:
你可以这样做:
__weak NSString *two;
但在这种情况下,您可能不想要这样做。
声明一个实例变量__weak 意味着对目标对象的引用(在你的例子中是一个字符串)只有在其他对象持有引用时才会存在。当最后一个持有强引用的对象释放字符串时,您的变量two 将自动得到nil-ed。这在对象保持相互引用时非常有用,例如在父子层次结构中。由于您的 NSString *two 不可能持有对您的对象的引用,因此使用 __weak 引用是非常值得怀疑的。
【解决方案2】:
您可以放心地做到这一点:
NSString* two = [[NSString alloc] init];
当您的类 Class 的实例由于某种原因被释放时,因为它是唯一(理论上)引用 two 的实例,它将被释放。
【解决方案3】:
我的建议(虽然我可能错了,但我认为 Apple 的建议)是养成始终为 iVar 使用属性的习惯,然后这个问题就消失了。