如何在类方法目标C中访问self

时间:2014-12-02 17:33:36

标签: ios objective-c class-method

我有一个使用类方法的Utility类。我试图在课堂方法中引用自我,但不能。我想知道如何在类方法中声明以下内容:

[MRProgressOverlayView showOverlayAddedTo:self.window animated:YES];

self.window它表示成员引用类型struct objc_class *' is a pointer; maybe you meant to use '->'

与无法调用self相关的另一个问题是,如何在我的@property中的类方法中引用.h中声明的.m

这是我的班级方法:

.m
+ (void)showHUD
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
    [MRProgressOverlayView showOverlayAddedTo:self.window animated:YES];

    //I would preferably like to call my property here instead
}


.h
@property (nonatomic) MRProgress * mrProgress;

2 个答案:

答案 0 :(得分:9)

类方法的重点在于它不是特定实例的一部分。在类方法中,self是类。

如果需要绑定到特定实例,那么它应该是实例方法。如果你想要一个访问特定实例的静态方法,那么将该实例(self)传递给它(虽然很难想象很多情况下这是有意义的。)

在上面的例子中,showHUD几乎可以肯定是一个实例方法。如果由于某种原因这没有意义,那么它应该是:

+ (void)showHUDForWindow:(UIWindow *)window;

然后,您可以将其称为showHUDForWindow:self.window并根据需要使用它。

答案 1 :(得分:0)

您可以使用单件模式。单例模式假定您的类的唯一实例存在。由于它是唯一的实例,因此您可以从类方法中使用它。

示例实施:

+ (MyClass*)sharedInstance {
    static dispatch_once_t once;
    static MyClass *sharedMyClass;
    dispatch_once(&once, ^ {
        sharedMyClass = [[self alloc] init];
    });
    return sharedMyClass;
}

然后,您可以通过[MyClass sharedInstance]访问共享实例,例如:

+ (void)doSomethingCool {
   [[self sharedMyClass] doSomething];
}