【问题标题】:Obj-C: Alternatives to pass by reference [closed]Obj-C:通过引用传递的替代方案[关闭]
【发布时间】:2013-05-12 00:51:49
【问题描述】:

所以,我在一个类中声明了 2 个变量,我们称之为 model.h,在这个类中,我初始化了 Car 和 Road 类的实例。如果我想让Car 知道 road 除了将Road 的引用传递给Car 在Model 中,在这种情况下还有什么其他选择?

【问题讨论】:

  • .h 是表示头文件的文件扩展名——您不会将实际类命名为Car.h 或Road.h。
  • Caleb:为了清楚起见——因为类通常有一个实现文件的头文件
  • 真的没必要——用类名就行了。
  • @TomLilletveit 实际上,您让这变得更难理解,而不是更容易。
  • 这是关于传递实例还是包含标头?您似乎对区别有点不清楚。

标签: objective-c design-patterns


【解决方案1】:

据我了解,将指针传递给指针并不是在整个应用程序中使用的一种很好的设计模式。它在objective-c 中仅用于选择少数操作,即NSError。请参阅下面帖子中 bbum 的回复。

Arguments by reference in Objective-C

从它的接受度和作者来看,我认为这是一个很好的建议,尽管可能不是“福音”。您当然可以将指针传递给任何您想要的指针,但这可能不是最好的方法。

另一种方法是考虑您正在考虑通过引用传递哪些值(意味着指向指针的指针),然后考虑方法/函数的设计,以便您可以将这些值封装到一个类中从您的方法/函数返回。

【讨论】:

  • 我不会考虑通过引用传递来表示“指针到指针”;在正常使用中,它意味着传入一个指针。任何 Obj-C 类都是通过引用传递的,尽管在极少数情况下您想要修改引用,例如您确定的 NSError。
  • 我认为这就是OP的意思,但我不确定。
  • @sapi,你是对的。语义有点混乱,但我的意思是“指向指针的指针”而不是通过引用传递。我知道 obj-c 对象总是通过引用传递。我已经修改了答案。
【解决方案2】:

在 Objective-C 中,对象总是通过引用传递,但您可以通过仔细设计类来缓解这种情况。

例如,NSString 和 NSNumber 始终按引用传递,但您可以将它们视为按值传递,因为它们是不可变的。您不能更改 NSString(只能是 NSMutableString)或 NSNumber,因此您是通过值传递还是通过引用传递并不重要。

同样,复制对象并在以后使用-isEqual: 比较它们可以模拟按值传递。 NSDictionary 这样做 - -setObject:forKey: 复制密钥并仅使用副本,而 -objectForKey: 使用 -isEqual: 和 -hash 来比较密钥。

在您的情况下,如果您的道路“地图”是固定的并且您不需要将道路链接回到汽车。如果你这样做了,那么通过引用传递实际上是一种有用的优化,而不是等待发生的错误。

【讨论】:

    【解决方案3】:

    真的没有其他选择。在 Objective-C 中,对象总是通过指针访问。没有办法声明一个是对象的变量,你只能创建引用对象的变量。

    【讨论】:

    • 我在想是否有其他选择,比如我如何设计我的课程,比如使用 Singelton 等。但在这种情况下,singelton 不适合。
    猜你喜欢
    • 2014-05-08
    • 2017-03-10
    • 2012-10-15
    • 2014-09-11
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2012-06-04
    • 2011-11-28
    相关资源
    最近更新 更多