2010-01-06 1 views
1

Если я установил базовый + активный SDK приложения iPhone в 3.0 и целевой уровень развертывания на 2.2, могу ли я использовать новые версии функций на 2.2 устройства?Использование функций iPhone OS 3.0 вместо устаревших 2.2 вызовов функций на 2.2 устройствах

Например, UITableViewCell требует выполнить требуемое изображение с помощью [cell.imageView setImage:image], в то время как в версии 2.2 вы бы назвали [cell setImage:image]. Будет ли использоваться новая авария [cell.imageView setImage:image] на 2.2 устройствах?

ответ

3

Нет, вы не можете использовать OS 3.0 на 2.2. Устаревший метод должен вести себя как обычно, по крайней мере, в ОС 3. Устаревание во многих случаях в ОС просто означает, что Apple рекомендует использовать новые методы, а не устаревшие; но эти методы могут исчезнуть и в будущем.

У вас есть несколько вариантов:

  1. Просто игнорируя предупреждения, до тех пор, как приложение и методы действительно работают на OS 3.0.
  2. Иметь проверку выполнения, чтобы определить версию операционной системы и вызывать соответствующий метод:

    double version = [[[UIDevice currentDevice] systemVersion] doubleValue]; 
    if (version >= 3.0) { 
        [cell.imageView setImage:image]; 
    } else { 
        [cell setImage:image]; 
    } 
    

    или еще лучше:

    if ([cell respondsToSelector:@selector(imageView)]) { 
        [cell.imageView setImage:image]; 
    } else { 
        [cell setImage:image]; 
    } 
    

    Обратите внимание, что при компиляции проверка времени, используя ifdef директивы выиграли» т работы

  3. Снижение OS 2.2 поддержка. Для вас вполне разумно ориентироваться только на 3,0, так как потребление 3,8 довольно велико. В случае с моим маленьким приложением в декабре у меня было 27 пользователей в системах до 3.0, из 2058 пользователей. Излишне говорить, что этот вариант значительно снижает потребность в тестировании.

+1

Достаточно честный - я надеялся, что система будет сортировать вызовы новых функций во время компиляции, когда целевая установка развертывания была надлежащим образом установлена. Лично я бы предпочел использовать 'if ([cell responsesToSelector: @selector (imageView)])' в качестве моей проверки времени выполнения, но я уверен, что это вопрос предпочтения;) – Ted

+0

Я добавил ваше предложение. AnswersToSelector, безусловно, лучше, чем ОС проверить мое мнение тоже, просто забыл об этом! Objective-C - динамический язык, поэтому методы не решаются во время компиляции. – notnoop

+0

Ницца. Тем не менее, мне все же интересно, будет ли '[cell.imageView setImage: image]' просто разбит во время выполнения на 2.2? К сожалению, у меня нет 2,2 устройства для тестирования. – Ted

1

Нет, вы не можете использовать вызовы OS 3.0 на устройстве 2.x. Я был бы удивлен, если вы даже можете установить приложение с таргетингом на 3,2 на устройство 2.x.

+1

Hi, Я думаю, что вы неправильно поняли - для цели развертывания установлено значение 2.2 (согласно лучшим практикам Apple). – Ted

+0

Здесь есть пара вещей: BASE SDK, цель развертывания и ACTIVE SDK. Вы можете установить BASE SDK на то, что вы хотите, однако вызовы API, специфичные для (например), 3.0 SDK не будут доступны (т.е. не будут скомпилированы), пока ACTIVE SDK не будет установлен в 3.0 или новее. Цель развертывания позволит вам установить 3.0-active-SDK на цель 2.x, но она не будет работать. –

+0

Итак, я получаю сбой во время выполнения при вызове '[cell.imageView setImage: image]' на 2.2? – Ted