#objective-c #static-variables #class-method
#objective-c #статические переменные #класс-метод
Вопрос:
Чтобы сделать мой код тестируемым, я создал отложенный инициализатор; таким образом, в моем модульном тестировании я могу имитировать любой объект, который я хочу, до вызова средства получения.
Однако, когда дело доходит до методов класса, мой метод класса не имеет доступа к свойствам, которые я определил.
- Есть ли какой-либо способ сделать свойства доступными с помощью моего метода класса?
- Если нет, есть ли какой-либо способ создать статические переменные, которые также доступны за пределами этого класса, т. Е. доступны моему классу модульного тестирования?
@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
Комментарии:
1. Я думаю, что собираюсь изменить метод моего класса на обычный метод и создать его экземпляр перед вызовом метода. Grrrr Objective C — такой слабый язык. Нет частных, общедоступных, статических, абстрактных, виртуальных, защищенных аннотаций к коду 🙁
Ответ №1:
По определению метод класса не может иметь состояния, что означает, что он не может обращаться к переменным, которые должны быть частью «экземпляра». В методе экземпляра (который начинается с «-«) указатель self ссылается на экземпляр, в котором вызывается метод, однако в методе класса (который начинается с » «) «self» ссылается на сам класс, а не на конкретный экземпляр. Это означает, что нет способа получить доступ к свойствам напрямую.
Однако одним из способов сделать это было бы создать статический экземпляр вашего класса в файле реализации:
static WebService* webService;
затем вы бы использовали что-то вроде метода «sharedInstance», чтобы получить к нему доступ, чтобы вы могли убедиться, что выделили переменную:
(WebService*)sharedInstance
{
if( nil == webService )
{
webService = [[WebService alloc] init];
}
return webService;
}
Другой вариант — определить статические переменные в вашем файле реализации, а затем создать методы класса для установки и получения их из других файлов / классов.
Комментарии:
1. Примечание по терминологии:
методы в Objective-C являются «методами класса», а не «статическими функциями». Методы, определенные с помощью
-
, являются «методами экземпляра».
Ответ №2:
Похоже, вам нужен синглтон.
<…>
Upd: Если этот способ неприемлем, вот прямые ответы на ваши вопросы:
Есть ли какой-либо способ сделать свойства доступными с помощью моего метода класса?
Нет. Вы должны каким-то образом создать экземпляр.
Если нет, есть ли какой-либо способ создать переменные statis, которые также доступны за пределами этого класса? (Доступно моему классу модульного тестирования
ДА. Вы можете создавать статические или глобальные переменные, которые будут хранить экземпляры. Они будут доступны извне вашего класса. Статическая переменная доступна в исходном файле, где она определена; а глобальная переменная доступна отовсюду. Если вы хотите иметь дело с глобальной переменной, вы определяете ее в своем файле *.m
MyClass *my_inst;
и вы делаете объявление в файле *.h:
external MyClass *my_inst;
Комментарии:
1. Я бы предпочел не использовать синглтон, который вызывает еще больше проблем, когда дело доходит до модульного тестирования и насмешек
Ответ №3:
или вы можете объявить статическую переменную на своем .m
, например
static NSString *name = @"Bob";
и объявить метод, подобный
- (NSString *)getName {
return name;
}
чтобы получить внутреннее имя извне. Таким образом, вам не придется иметь дело с внешними глобальными переменными…