在Objective-C中的类方法中如何访问实例变量?

5

我正在开发一个应用程序,其中实现了一个类方法。如何在类方法中访问实例变量?

这是我的实例方法,创建了一个名为“SomeClass”的对象:

-(void)viewDidLoad
{
   SomeClass *obj=[SomeClass alloc] init];
}

这里是一个类方法,在这个方法中我试图访问实例变量"obj",结果出现了一个错误,提示"在类方法中访问实例变量'obj'"。
+(void)classMethodImplement
{

}

你这样定义的话,意味着它只在函数作用域内? - ddoor
请问是否有其他解决方案,请告诉我,先生。 - venkat
1
基本问题在于你可以有一千个(或一百万个)类的实例,那么你如何决定引用哪一个? - Hot Licks
你怎么说“千”?我可以保证,如果那个类是应用程序主视图的视图控制器,那么它将只有一个实例,并且将在启动时分配。这个实例永远不会被释放(直到应用程序终止)。 - Mazyod
3个回答

15

你不能从类方法中访问实例变量。因为实例变量是绑定到某个类的特定实例上的,从类方法中访问它们是没有意义的,因此编程语言不允许这样做。


抱歉,但这太疯狂了。在我的原型应用程序中,我经常使用类方法访问实例变量。我使用了我发布的想法,它有效,因此可以通过类方法访问实例变量。即使您有许多实例,也可以定义一个静态数组来存储所有已分配的实例。那是个好主意吗?这不是问题所在,请让提问者自行决定。 - Mazyod
@Mazyod 当然可以,但你必须有非常好的理由才能避免糟糕的实践。在我看来,如果你必须以这种方式从类方法访问实例变量,那么你的设计是有缺陷的(注意,我没有投反对票)。 - user529758

9

有一个明显的方法可以实现。你只需要使用静态变量。

选项1:

将想要的实例变量存储到静态变量中:

static id static_iVar = nil;
- (void)viewDidLoad {
    // blah, blah, blah
    static_iVar = _iVar;
}

选项2:

self存储到静态变量中,然后随意访问其实例变量:

static id static_self = nil;
- (void)viewDidLoad {
    // blah, blah, blah
    static_self = self;
}

无论哪种选择,请务必非常小心。如果您在未进行适当检查和处理的情况下分配了两个相同类的实例,则无人知道可能出现什么样的错误。

其次,只需在静态方法中使用静态变量:

+(void)classMethodImplement
{
    // Use it here...
}

4
将类方法重写,以便它的调用者提供必要的对象。
+(void)classMethodImplement:(SomeClass *)obj
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接