1

在 iOS 5 中使用 ARC 时,弱 IBOutlet 会创建一个归零引用,从而避免需要

self.< IBOutlet property > = nil;

-(void)viewDidUnload

如果我使用的是 iOS 4(并使用 ARC)并被迫使用unsafe_unretained,这是否意味着我必须覆盖viewDidUnload并将属性手动设置为 nil ?

编辑:这与我的情况有关:IBOutlets 在 ARC 下应该强还是弱? 例外是:我不能使用创建归零参考的“弱”关键字。

希望我的问题更清楚。

谢谢

4

2 回答 2

3

在使用 ARC 时,我相信您已经意识到,weak 属性不能在 iOS5 之前使用。硬币的另一面是使用 unsafe_unretained。弱属性会自动将你的属性设置为 nil。Unsafe_retained(在 iOS 5 之前的版本中也称为“assign”)不会,您需要自己执行此操作。

于 2012-04-06T13:36:01.877 回答
1

如果没有属性(在 iOS 中),IBOutlet 将是由 KVC 设置和保留的 ivar。通过@property设置属性来设置 ivar。

在 ARC 项目中,如果创建一个 nib 并将一个项目(例如UILabel)拖到 .h 文件中,@property则会添加一个 strong 以及在 .m 文件中将属性设置为 nil 的行将添加到viewDidUnload方法中,并且属性的@synthesize 语句。

还有其他方法可以处理保留nib IBOutlets该工作的方法,并且在某些指标上甚至可能更好。

从 Apple 文档Resource Programming Guide -Managing the Lifetimes of Objects from Nib Files

因为 outlet 的行为取决于平台,所以实际的声明有所不同:

对于 iOS,您应该使用:
@property (nonatomic, retain) IBOutlet UserInterfaceElementClass *anOutlet;

对于 OS X,您应该使用:
@property (assign) IBOutlet UserInterfaceElementClass *anOutlet;

我的信念是不要与苹果做事的方式作斗争,这样做往往会使事情变得更难。还要考虑到苹果拥有该平台未来的内幕消息。:-)

于 2012-04-05T11:29:40.427 回答