我有一个具体的问题,我找不到答案。
我有一个有一些观点的故事板。一些观点有出口。 我知道我必须将我的出口声明为弱参数,但我不知道是否必须声明getter和setter(使用@property和synthesize)。
1 - __weak IBOutlet UITableView *table;
2 - @property(nonatomic, weak) UITableView *table;
如果我只是声明(1)我可以在视图控制器上执行“table”。
如果我宣布(1)和(2)我可以做自我表格。
有什么区别?什么是最好的方法?
答案 0 :(得分:4)
(1)是一个实例变量声明。 (2)是属性定义。如果合成属性或使用自动合成,则在这种情况下也会创建实例变量。通常,除非您希望在公共API或多态中公开视图,否则声明一个实例变量就足够了。
还有一些其他特定情况可能是首选财产。例如,如果要引用块内的视图但不希望保留self
,则使用weakSelf
范例可以更轻松地访问属性。但是你也可以创建对视图的弱引用,所以这没有实际意义。
使用点(.
)表示法不能访问实例变量,而是使用箭头(->
)表示法直接或较少使用。
所以:
[_tableView reloadData];
或
[self->_tableView reloadData];
请记住,在nil引用上使用->
会导致访问权限不佳。
答案 1 :(得分:0)
你可以只为这两个“表”,你只需要在你的实现中使用@synthesize
来合成属性。
答案 2 :(得分:0)
第一个是实例变量,第二个是定义属性。惯例是始终使用属性,现在默认为自动合成,使用在约定_varName
上命名的iVar。然后,您可以使用_varName
或self.varName
访问变量。建议始终通过属性访问变量,唯一的例外是当您覆盖属性的getter时。
答案 3 :(得分:-1)
通常没有理由将出口声明为强势财产,这意味着所有权。大多数观点都归他们的超级视图所有。
@property (weak) IBOutlet UITableView *table;
然后你就像任何其他财产一样对待
@synthesize table = _table;
- (void)someMethod
{
[self.table doSomething ....]
}