Objective c 具有局部方法作用域的实例变量

Objective c 具有局部方法作用域的实例变量,objective-c,c,scope,instance-variables,Objective C,C,Scope,Instance Variables,在类实例的生命周期内,是否可以在方法中创建一个局部作用域变量 我不能使用static,因为它会在所有类实例中共享,这是不好的。本质上,我希望通过使实例变量只能由类中的一个特定方法访问来保护它 我想这真的不可能做到,但我想我会问的,因为这会很有帮助 更新 因此,我将@dasblinkenlight的答案标记为正确(事实确实如此)。尽管@joshcaswell在评论中提供了一个更好的答案,这是一个实际的实现。这提供了一种更简单的关联引用的方法,而无需深入运行时(因为他是为您做的)。如果我在最初的搜索

在类实例的生命周期内,是否可以在方法中创建一个局部作用域变量

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

我想这真的不可能做到,但我想我会问的,因为这会很有帮助

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

为什么这样做?

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

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


您也可以,但这需要与运行时直接交互。所有方法也可以访问这些引用,但您可以通过使它们的静态
ObjectTagKey
local方法来“隐藏”它们。

实例变量?@bbum local方法scope@GabrielePetronella不确定这与实例变量相比买了什么。@bbum哦,我也不知道我认为这和Richard J.Ross III写的一个非常聪明但相当粗野的解决方案是一样的。是的,使用关联引用是可行的,但这对我想要完成的太多了。我正在懒洋洋地实例化该变量,并认为如果我可以强制其他方法调用使用该方法而不是直接访问该变量,那就太好了。@AaronHayman如果ivar在类扩展中(即不在标题中),唯一可以直接访问它的代码就是您自己的代码。我想您误解了。我的意思是“强制同一类中的其他方法”使用构造函数方法,而不是直接访问iVar。这将确保我不会在iVar没有被实例化时意外地直接访问它(例如,如果我在一段时间后返回代码)。我所有的IVAR都在
@实现中私下列出
,除非我绝对需要公开它们。。。这是非常罕见的。@AaronHayman我明白了。在这种情况下,您可以为变量指定一个与实际名称相关的特殊名称,但也可以指示该变量是延迟初始化的。例如,如果变量存储
maxSize
,则调用变量
\u lazyInitMaxSize
,并在
maxSize
方法中专门使用它。维护您的代码的人员(包括您自己)应该能够猜测他们不能直接访问此变量。