2014-12-02 6 views
3

У меня есть класс Utility, который использует методы класса. Я пытаюсь ссылаться на себя в методе класса, но не могу. Мне было интересно, как бы я объявляю следующее в методе класса:Как получить доступ к объекту класса self в классе C

[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; 
+1

Я думаю, может быть, вы непонимание использования метода класса. Вызов методов класса - это не то же самое, что вызов метода на экземпляр класса, потому что у вас нет экземпляра этого класса. В этом контексте нет «я» с методом класса, потому что «я» относится к экземпляру объекта, который был создан. – Aaron

+0

@ Аарон, ты прав, я думаю, что я это неправильно понял. Спасибо за подробное объяснение. – DevC

+2

Технически я считаю, что 'self' относится к классу в методе класса. –

ответ

9

Вся суть метода класса является то, что он не является частью конкретного экземпляра. Внутри метода класса self является классом.

Если вам нужно привязать к определенному экземпляру, то это должен быть метод экземпляра. Если вы хотите, чтобы статический метод обращался к определенному экземпляру, передайте ему этот экземпляр (self) (хотя трудно представить много случаев, когда это имеет смысл).

В приведенном выше примере showHUD должен быть методом экземпляра почти наверняка. Если это не имеет смысла, по какой-то причине, то он должен быть:

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

Вы можете назвать его как showHUDForWindow:self.window и использовать его по мере необходимости.

+0

Спасибо за это, это было очень полезно. Так должен ли метод класса не иметь свойств? Или как вы относитесь к ним в классе? Я очень ценю детали :) – DevC

+1

Методы класса могут ссылаться только на свойства типа (переменные класса для классов, статические переменные для структур). См. «Синтаксис свойств свойства» (https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Properties.html). Но переменные класса еще не реализованы в компиляторе Swift (статические переменные в структурах). Тем не менее, методы, не относящиеся к фабричным классам, в любом случае несколько редки. Как правило, вы должны создать на нем экземпляр и методы вызова. –

0

Вы можете использовать одноэлементный шаблон. Шаблон Singleton предполагает, что существует единственный экземпляр вашего класса. Поскольку это единственный экземпляр, вы можете использовать его из методов класса.

Пример реализация:

+ (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]; 
} 
+0

Просто потому, что ОП путают между методами класса и методами экземпляра, абсолютно не является причиной для тяготения к синглонам. [Синглтоны злы] (http://wiki.c2.com/?SingletonsAreEvil), поэтому используйте их экономно и только там, где это необходимо. В этом случае, когда он просто пытается выяснить, как получить ссылку на окно, введение синглтона только тупит проблему. – Rob

Смежные вопросы