Как использовать self в методе класса в Objective C

Я пытаюсь создать собственный плагин Cordova, и я хотел бы создать метод в Objective-C, который вызывает функцию javascript alert('text');

Так я обычно делаю, и это работает хорошо.

- (void)myMethod:(CDVInvokedUrlCommand*)command
{
    [self.commandDelegate evalJs:@"alert('text');"];
}

Проблема в том, что мне нужно сделать то же самое, используя метод класса. Если я изменю - на +, я получаю сообщение об ошибке.

+ (void)myMethod:(CDVInvokedUrlCommand*)command
{
    [self.commandDelegate evalJs:@"alert('text');"];
}

person David Marcus    schedule 19.05.2017    source источник
comment
Вероятно, было бы полезно рассказать нам, что такое сообщение об ошибке...   -  person l'L'l    schedule 19.05.2017
comment
Ошибка Ожидаемый идентификатор   -  person David Marcus    schedule 19.05.2017


Ответы (1)


Подумайте об этом; экземпляр подобен машине, а класс подобен фабрике, которая построила машину.

У каждой машины свой водитель (делегат), но завод не имеет доступа к каждому водителю машины, если только они специально не разработали способ получить доступ (например, через On-Star).


Итак, в этом ваша проблема. Вы пытаетесь получить доступ к состоянию экземпляра из-за пределов области действия экземпляра. В методе класса self относится к классу, а не к какому-либо конкретному экземпляру.

Решение может быть одним из нескольких. Вы можете использовать singleton; например, один экземпляр этого класса, который используется глобально в вашей программе.

person bbum    schedule 19.05.2017
comment
Спасибо за эту аналогию. Теперь я понимаю проблему, и я также получил предложенное вами решение создания глобальной переменной для представления класса. Я только начинаю работать с Objective-C, поэтому попытаюсь понять, как это сделать. - person David Marcus; 19.05.2017
comment
@DavidMarcus Концепция класса и экземпляра сбивает всех с толку, когда они начинают работать с любым ОО-языком. Другой, с которым вы столкнетесь, — это автоматическое создание экземпляров. т.е. если у вас есть файл XIB, действие загрузки XIB приводит к созданию группы экземпляров. Таким образом, создание нового экземпляра не совсем уместно. Вы должны использовать механизмы, предоставляемые системой, чтобы добраться до экземпляров, выпавших из загрузки. - person bbum; 19.05.2017
comment
Спасибо за внимание к этому. - person David Marcus; 19.05.2017
comment
так что в основном self в методе класса похоже на статический метод? - person Daniel Lizik; 21.02.2019
comment
@DanielLizik В значительной степени. Ключевое отличие состоит в том, что методы класса Objective-C можно переопределить и/или изменить, чего нельзя сказать о настоящих статических методах. stackoverflow .com/questions/8089186/ - person bbum; 22.02.2019