在Objective-C中使用@property和weak属性的用法

3

我有一个具体的问题,但找不到答案。

我有一个故事板,其中包含一些视图。有些视图有插座。 我知道我必须将我的插座声明为弱参数,但是我不知道是否需要声明getter和setter(使用@property和synthesize)。

1 - __weak IBOutlet UITableView *table;
2 - @property(nonatomic, weak) UITableView *table; 

如果我只是声明(1),我可以在视图控制器上直接使用"table"。

如果我声明了(1)和(2),我可以使用self.table。

两者之间有什么区别?哪种方法最好?

4个回答

4

(1) 是实例变量声明。(2) 是属性定义。如果您综合使用属性,或者使用自动综合,则在这种情况下也会创建实例变量。通常,除非您想将视图公开为公共API或用于多态,否则仅声明实例变量就足够了。

还有一些其他特定情况下可能更喜欢使用属性。例如,如果您想在块内引用视图但不希望保留self,则使用weakSelf范例访问属性更容易。但是,您也可以创建对视图的弱引用,因此这是无关紧要的。

不使用点符号(.)表示法来访问实例变量,而是直接使用或者很少使用箭头(->)表示法。

因此,可以使用以下任一方式:

[_tableView reloadData];

或者

[self->_tableView reloadData];

请记住,在空引用上使用->会导致错误访问。


谢谢您的回答。您能给我指出一个使用weakSelf范例的例子吗? - Tony

0
你可以同时使用 "table",只需要在实现中使用 @synthesize 合成属性即可。

我在之前的回答中添加了一条评论。 - Tony

0
第一个是实例变量,第二个是定义属性。惯例是始终使用属性,现在默认为自动合成,iVar 命名为约定的 _varName。然后可以使用 _varNameself.varName 访问变量。建议始终通过属性访问变量,唯一的例外是当您重写属性的 getter 时。

-1

通常情况下,没有必要将outlet声明为强引用属性,即意味着拥有所有权。大多数视图都由它们的父视图拥有。

@property (weak) IBOutlet UITableView *table;

然后您将其视为任何其他属性

@synthesize table = _table;
- (void)someMethod
{
     [self.table doSomething ....]
}

另请参阅从Nib文件管理对象的生命周期


我的问题不是为什么我必须声明为weak。我真的想知道为什么要声明一个属性(和synthesize)。为什么不只是声明它为__weak IBOutlet UITableView *table;? - Tony
我似乎已经穿过镜子,现在我既不理解问题也不理解答案。请原谅。 - Elise van Looij

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