Должны ли мы использовать NSClassFromString перед использованием любого класса в нашем коде? - PullRequest
0 голосов
/ 18 октября 2010

Мне всегда интересно, должны ли мы использовать NSClassFromString перед использованием какого-либо встроенного класса в нашем коде, чтобы сделать его универсальным. Или есть какая-то стандартная практика, чтобы использовать это. То же самое для собственности. Должны ли мы использовать вызовы valueForKey и setValue отдельно для доступа к любому свойству. Это стандартная практика?

Например, посмотрите на код ниже

// Screen scaling
  if ([self respondsToSelector:@selector(setContentsScale:)])
  {
   Class screenClass = NSClassFromString(@"UIScreen");
   if ( screenClass != Nil)
   {
    id scale = [[screenClass mainScreen] valueForKey:@"scale"];
    [(id)self setValue:scale forKey:@"contentsScale"];
   }
  }

Здесь все проверяется перед использованием. Нужно ли это делать, а как насчет производительности?

1 Ответ

3 голосов
/ 18 октября 2010

Нет, это только для классов, которые вы не знаете, существуют ли они в вашей среде или динамически загружаются во время выполнения (то, что iOS не позволяет, но доступно в Mac OS X, так что вы ненужно позаботиться об этом).

Это необходимо сделать, например, если вы хотите поддерживать устройства 3.0, но используйте классы 4.x, если они доступны, например классы GameKit.Поскольку UIScreen доступен начиная с версии 2.0, вам не нужно использовать NSClassFromString здесь.Но вам нужно будет проверить наличие scale, поскольку оно было добавлено в 4.0, и valueForKey:@"scale" повысит NSUndefinedKeyException на устройствах до 4.0.

Вместо кодирования значения ключа вытакже может сделать это:

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    CGFloat scale = [[UIScreen mainScreen] scale];
    // or scale = [UIScreen mainScreen].scale;
    // Now do something with the scale.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...