3

是否可以在方法中为其类实例的生命周期 创建一个局部范围的变量?

我不能使用static,因为它将在所有类实例之间共享,这不好。本质上,我想保护一个实例变量,使其只能由类中的一种特定方法访问。

我认为这真的无法做到,但我想我会问,因为它会有很大帮助。

更新
所以,我将@dasblinkenlight 的答案标记为正确(确实如此)。尽管@joshcaswell 在评论中提供了对更好答案的参考,但这是Richard J. Ross III 对关联引用的实际实现。这提供了一种更简单的方法来关联引用,而无需深入运行时(因为他会为你做这件事)。如果我在最初的搜索中找到了这个答案,我一开始就不会问这个问题。但我没有,所以我做到了。

为什么这样做?
我今天看到了 Brent Simmons 的一篇文章,名为Why is Using Associated Objects a Hack?,这与为什么我首先需要这样做的问题直接相关在我与@dasblinkenlight 的评论讨论中,我解释说我想保护一个延迟实例化的 iVar 不被直接访问,除非它的构造函数方法。最好的方法是对所有其他类方法隐藏 iVar,以便只能通过它的构造函数方法访问它。当然,您可以依靠命名约定(即:_lazyiVar)来提醒你不要直接访问它,但这是(IMO)一种相当脆弱的保护形式(我过去做过这件事)。使用关联引用一种 hack,您应该质疑直接访问运行时的技术,但在这种情况下,我更喜欢 hack,因为它通过保护我延迟实例化的变量,使我的代码不太可能崩溃。

4

1 回答 1

4

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

您还可以使用关联引用伪造实例变量的添加,但这需要与运行时直接交互。所有方法也可以访问这些引用,但是您可以通过将它们静态ObjectTagKey地设置为您的方法来“隐藏”它们。

于 2013-10-18T18:09:53.830 回答