具有本地方法范围的实例变量

时间:2013-10-18 18:07:22

标签: objective-c c scope instance-variables

可以在一个方法中为它的类实例的生命周期创建一个 本地范围的变量 吗?

我不能使用static因为它会在所有类实例中共享,这是不好的。本质上,我想通过使实例变量保护它,以便只能通过类中的一个特定方法访问它。

我认为这不可能真的完成,但我想我会问,因为它会有很多帮助。

更新
所以,我正在将@dasblinkenlight的答案标记为正确(并且确实如此)。虽然@joshcaswell在评论中提供了更好的答案,这是associative references by Richard J. Ross III的实际实现。这提供了一种更简单的关联引用的方法,而不必深入到运行时(因为他为你做了)。如果我在原始搜索过程中找到了这个答案,我首先不会问这个问题。但我没有,所以我做了。

为什么这样做?
我今天看到Brent Simmons的一篇文章叫做Why is Using Associated Objects a Hack?,它与为什么的问题直接相关,我首先需要这样做(@bbum& @GabrielePetronella问这个问题)。在我与@dasblinkenlight的评论讨论中,我解释说我希望保护一个懒惰的实例化iVar直接被访问,除非它的构造方法。执行此操作的最佳方法是将iVar隐藏在所有其他类方法中,以便只能通过它的构造方法进行访问。当然,你可以依靠命名约定(即:_lazyiVar)来提醒你不能直接访问它,但这是(IMO)一种相当脆弱的保护形式(我已经完成了这一点)过去的事情)。使用关联的引用 是一个hack而你应该提出直接访问运行时的技术,但在这种情况下我更喜欢hack,因为它使我的代码更少可能会因保护我的懒惰实例变量而崩溃。

1 个答案:

答案 0 :(得分:4)

你是对的,这是不可能的:本地人不能超过他们定义的范围。您可以通过类扩展添加“私有” - 实例变量,但这些可以被所有方法的实现访问,而不仅仅是单个方法。

您也可以fake addition of instance variables with associative references,但这需要与运行时直接交互。所有方法都可以访问这些引用,但您可以通过在方法中使用静态ObjectTagKey来“隐藏”它们。