为什么Xcode会为IBOutlet创建弱引用?

Ted*_*tel 0 objective-c iboutlet ios automatic-ref-counting

我注意到当我在故事板中创建一个插座时,它会生成以下代码__weak IBOutlet UILabel *mLabel;.

为什么它将它声明为弱指针?根据我的理解,当对象被释放时,其所有成员也将被释放.在我的大部分代码中,我都宣称这些出口是强有力的指针.这会产生问题吗?

Hol*_*lly 5

为了扩展@ Joel的答案,这不是ARC和手动引用计数(MRC)之间的变化.在具有NIB的MRC代码中,只有根级视图声明为:

@property (nonatomic, retain) IBOutlet UIView *view;
Run Code Online (Sandbox Code Playgroud)

所有子视图self.view都应声明为:

@property (nonatomic, assign) IBOutlet UIView *aSubView;
Run Code Online (Sandbox Code Playgroud)

当它转换为ARC时,它应该是这样的:

@property (nonatomic, strong) IBOutlet UIView *view;
@property (nonatomic, weak) IBOutlet UIView *aSubView;
Run Code Online (Sandbox Code Playgroud)

这样做的原因是为了节省方法中的工作(和复杂性)-viewDidUnload.释放根级视图后,将自动释放所有子视图.如果您是强引用,则除非-viewDidUnload明确包含以下内容,否则不会取消分配子视图:

self.aSubView = nil;
Run Code Online (Sandbox Code Playgroud)

到目前为止阅读的任何人都会注意到-viewDidUnload从iOS 6.0开始折旧.这使得大部分内容无关紧要,但遵循惯例仍然是一种很好的做法.


Xu *_*Yin 5

根据iOS Developer Library:链接在这里

部分: Managing the Lifetimes of Objects from Nib Files

从实际角度来看,在iOS和OS X中,出口应该被定义为声明的属性.Outlets通常应该是弱的,除了那些从File的Owner到nib文件中的顶级对象(或者在iOS中,故事板场景中)应该很强大.因此,您创建的插座通常应该很弱,因为:

例如,您创建到视图控制器视图或窗口控制器窗口的子视图的出口是不暗示所有权的对象之间的任意引用.

强大的出口通常由框架类指定(例如,UIViewController的视图出口或NSWindowController的窗口出口).

@property (weak) IBOutlet MyView *viewContainerSubview;

@property (strong) IBOutlet MyOtherClass *topLevelObject;