Доступ к свойству из метода класса?

Чтобы мой код можно было тестировать, я создал ленивый инициализатор; Таким образом, в моем модульном тесте я могу издеваться над любым объектом, который захочу, до того, как будет вызван геттер.

Однако когда дело доходит до методов класса, мой метод класса не имеет доступа к свойствам, которые я определил.

  1. Есть ли способ сделать свойства доступными для моего метода класса?
  2. Если нет, есть ли способ создать статические переменные, которые также доступны за пределами этого класса, т. Е. Доступны для моего класса модульного тестирования?

@implementation
@synthesize webService;

+ (void)doSomething
{
   self.webService.url = @"some url";
   [self.webService start];
   // do other things
}

- (WebService*)webService
{
   if (!webService)
   {
      webService = [[WebService alloc] init];
   }
   return webService;
}

@end

person aryaxt    schedule 24.04.2011    source источник
comment
Я думаю, что изменю свой метод класса на обычный метод и создам его экземпляр перед вызовом метода. Грррр, Objective C — такой слабый язык. Нет частных, общедоступных, статических, абстрактных, виртуальных, защищенных, кодовых аннотаций :(   -  person aryaxt    schedule 24.04.2011


Ответы (3)


Похоже, вам нужен синглтон.

<...>

Upd: Если этот путь неприемлем, вот прямые ответы на ваши вопросы:

Есть ли способ сделать свойства доступными для моего метода класса?

Нет. Вы должны каким-то образом создать экземпляр.

Если нет, есть ли способ создать переменные состояния, которые также доступны за пределами этого класса? (Доступно моему классу модульного тестирования

да. Вы можете создавать статические или глобальные переменные, которые будут хранить экземпляры. Они будут доступны за пределами вашего класса. Статическая переменная доступна в исходном файле, где она определена; и глобальная переменная доступна отовсюду. Если вы хотите иметь дело с глобальной переменной, вы определяете ее в своем *.m файле.

MyClass *my_inst;

и вы делаете объявление в файле *.h:

external MyClass *my_inst;
person Jurlie    schedule 24.04.2011
comment
Я предпочитаю не использовать синглтон, который вызывает еще больше проблем, когда дело доходит до модульного тестирования и насмешек. - person aryaxt; 24.04.2011

По определению метод класса не может иметь состояние, а это значит, что он не может получить доступ к переменным, которые должны быть частью «экземпляра». В методе экземпляра (тот, который начинается с "-") указатель self относится к экземпляру, для которого вызывается метод, однако в методе класса (тот, который начинается с "+") "self" относится к сам класс, а не конкретный экземпляр. Это означает, что нет прямого доступа к свойствам.

Однако один из способов сделать это — создать статический экземпляр вашего класса в файле реализации:

static WebService* webService;

тогда вы должны использовать что-то вроде метода «sharedInstance», чтобы получить к нему доступ, чтобы вы могли выделить переменную:

+(WebService*)sharedInstance
{
    if( nil == webService )
    {
        webService = [[WebService alloc] init];
    }
    return webService;
}

Другой вариант — определить статические переменные в вашем файле реализации, а затем создать методы класса для установки и получения их из других файлов/классов.

person drewag    schedule 24.04.2011
comment
Примечание по терминологии: методы + в Objective-C — это методы класса, а не статические функции. Методы, определенные с помощью -, являются методами экземпляра. - person jscs; 24.04.2011

или вы можете объявить статическую переменную на вашем .m, например

static NSString *name = @"Bob";

и объявить метод вроде

- (NSString *)getName {
  return name;
}

чтобы получить внутреннее имя извне. Таким образом, вам не нужно иметь дело с внешними глобальными переменными...

person Duck    schedule 25.11.2016