iOS: __weak vs (weak)

4

这两行代码之间有什么不同吗?

__weak IBOutlet UITextField *usernameField;

@property (weak) IBOutlet UITextField *usernameField;

如果您在.h或.m文件的接口部分声明了其中任何一个,会发生什么情况?
2个回答

6

是的。第一个示例声明了一个名为usernameField的弱引用实例变量,而第二个声明了一个名为usernameField的弱引用属性,以及一个由该属性访问的实例变量_usernameField

如果您在.m文件的@interface部分中声明它,则只能在该.m文件中访问它(除非您操作Objective-C运行时)。


你会说Objective-C中的属性类似于Java中的静态类变量吗? - user2563044
这没有意义,Java中的静态字段意味着不特定于任何实例,因此不是实例变量。你是说Objective C中的实例变量不特定于该类的任何实例吗? - user2563044
1
抱歉,我在打字时不小心发布了一条评论。Objective-C中的实例变量与Java类似,与实例相关联。属性是一个实例变量,配对使用(通常是自动生成的)访问器方法。Objective-C没有静态类变量,但如果您需要一个,请参见Objective C Static Class Level variables - NobodyNada
其实我是在尝试为类创建私有实例变量时偶然发现了这个问题。特别是表示UI对象(如UITextFields等)的变量,我想没有理由将它们放在公共.h文件中。 - user2563044
一个弱实例变量也明显不可用于 NIB 加载器。这是一个完全动态的运行时,在其中接口被作为数据加载,而不是通过写一些隐藏代码来实现。因此,声明一个为 IBOutlet 没有意义。 - Tommy

2

区别不在于 weak 引用,而仅在于第一个是一个 instance ,第二个是 @property

__weak(weak) 是同一件事,但是第二个用作属性的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接