【问题标题】:IOS setting property syntax issueIOS设置属性语法问题
【发布时间】:2012-11-12 19:20:54
【问题描述】:

有人可以向我解释为什么会这样吗:

SpecialView *view = [[SpecialView alloc]initWithFrame:CGRectMake(0, 0, 320, 164)];
self.specialView = view;
self.tableView.tableHeaderView = self.specialView;

这不是:

self.specialView = [[SpecialView alloc]initWithFrame:CGRectMake(0, 0, 320, 164)];
self.tableView.tableHeaderView = self.specialView;

非常感谢!

编辑 1:.h 中的属性类似于:

@property (weak, nonatomic) SpecialView *specialView;

当我的意思是它不起作用时,我的意思是最后 self.specialView 为零。 (是的,我正在使用 ARC)

【问题讨论】:

  • 显示这两个的属性声明
  • “不起作用”是什么意思?它看起来正确(假设为 ARC)。
  • 编辑回答你们两个:)
  • 你能打印 self.specialView 即 NSLog(@"%@",self.specialView);在这两种情况下。
  • 如果这是你唯一使用specialView的地方,那我觉得没必要。只需将您发布的第一行代码的左侧更改为“self.tableView.tableHeaderView”。这应该就是你所需要的。

标签: objective-c ios syntax properties


【解决方案1】:

您的财产被定义为weak。这意味着不保留引用。这也意味着当对象被释放时,该属性将被设置为nil

在第一段代码中,您将SpecialView 实例分配给本地(强)变量。这会使对象保持一段时间。然后将实例分配给(弱)属性。这没有任何帮助。但是随后您将 weak 属性分配给表视图的标题。在局部变量view 超出范围后,正是这个额外的引用使实例保持活动状态。但是,如果您要为表格分配另一个标题或表格视图消失,则特殊视图将被释放并解除分配,并且该属性将重置为 nil。

在第二段代码中,您没有局部变量。所以对象立即被释放和释放,属性被重置为nil

您的属性很可能需要定义为strong 而不是weak

【讨论】:

  • 好的,非常感谢,我会选择你作为正确答案,但你能告诉我为什么 tableView 可以弱化而不是这个 headerView 吗?谢谢
  • 可能是因为表格视图被添加为子视图,所以它仍然有其他对它的引用。
  • @rmaddy,第一个不会好吗,因为表格视图将保留其标题视图?
  • @rdelmar 是的。我忽略了最后一个任务。我专注于前两行。我会更新我的答案以反映这个细节。谢谢。
  • 即使我认为它也应该工作,如果它不强大它不会,这就是为什么我首先提出这个问题:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多