【问题标题】:Objective-C Pointers > pointing to propertiesObjective-C 指针 > 指向属性
【发布时间】:2011-02-15 11:39:23
【问题描述】:

我有一个名为“estimatedTime”的自定义类的 NSInteger 属性,现在,在我的 UITableView 类中,我试图将此属性作为指向 UITableViewCell 的指针传递。我似乎无法让它工作!我尝试了以下方法:

NSInteger *pointer = sharedManager.tempTask.&estimatedTime;
NSInteger *pointer = &sharedManager.tempTask.estimatedTime;

我得到错误:lvalue required as unary '&' 操作数 和:“&”标记之前的预期标识符

你不能传递一个指向属性的指针吗?该属性不只是它自己指向我的自定义类中的 ivar 吗?我需要它作为指针类型,以便在 UITableViewCell 内更改 UITextField 时编辑值。

谢谢,希望有意义!

【问题讨论】:

  • 想想你想要什么。进行这种直接访问违反了面向对象封装的每一个原则。它会破坏很多东西;键值观察、任何类型的内部设置器逻辑、验证、更改通知、委托......都可能被破坏。

标签: iphone objective-c ipad ios pointers


【解决方案1】:

属性不是变量;它们只是 get/set 样式方法的语法糖。因此,您不能获取属性的地址。

【讨论】:

  • 那么有没有办法在我的自定义类的特定实例中获取 ivar 的内存位置?
  • 如果您拥有该类,则只需添加一个返回指向内部 ivar 的指针的方法。
【解决方案2】:

正如 Marcelo 所说,您不能使用属性本身来做到这一点。

你要么必须:

  1. tempTask 添加一个方法,该方法返回指向estimatedTime iVar (NSInteger *pointer = sharedManager.tempTask.estimatedTimePointer) 的指针
  2. 使用临时的NSInteger,将其地址用于您需要的任何呼叫,然后将结果复制到estimatedTime

选项 1 可能是一个非常糟糕的主意,因为它破坏了对象封装。

【讨论】:

  • 虽然我同意这是一个 真的 坏主意(不仅对于封装,而且对于对象生命周期和引用计数对象),尽管它可以说是 NSData 所做的只有以包装 C 风格的内存块为目标。所以你可以找到先例。
  • 虚假先例。 NSData 是不可变的,因此不是示例。 NSMutableData 确实在一个非常具体的例外情况下允许这样做,但有几个关于它有多大问题的警告。对于常规的 ivars?不存在这样令人信服的先例。
【解决方案3】:

对于在指针中使用数字,我建议使用 NSNumber* 而不是 NSInteger*(NSInteger 实际上是 int)。例如,如果 sharedManager.tempTask.estimatedTime 是一个 NSInteger,你可以这样做:

NSNumber *pointer = [NSNumber numberWithInt:sharedManager.tempTask.estimatedTime];

现在,当您想对数字使用 int 值时,请执行以下操作:

NSInteger i = [n intValue];

NSNumber * 是一个 obj-c 对象,所以通常的保留/释放/自动释放机制适用。

【讨论】:

    【解决方案4】:

    其实当你说 Object1.Propertyxy.Property1

    在某些内存中,它实际上被称为 FUNCTION 而不是 VARIABLE/VALUE。

    在您的情况下,“tempTask”将充当 函数和“estimatedTime”作为 论点,结果将是 函数的返回。

    我知道并完全同意指针非常有利于提高速度,但在这种情况下它只是无用的,因为它需要将该 PROPERTY 存储在某个地方,然后引用 i,只是浪费时间和内存,只使用它如果您每次运行必须使用该非常特殊的属性 100 次:D

    希望这有帮助,如果它不只是让我知道,我会很乐意提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2013-01-07
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多