Сбой собственного расширения AIR в NSDictionary objectForKeyedSubscript в iOS 5.1

Создание собственного расширения Adobe AIR, использующего следующий код objC, приведет к сбою в iOS 5.1.

NSDictionary *value=[NSDictionary dictionaryWithObjectsAndKeys: @"aSampleValue",@"aSampleKey",nil];    
NSLog(@"Try objectForKeyedSubscript: %@", [value objectForKeyedSubscript:@"aSampleKey"]);

Это завершится ошибкой с «[__NSCFDictionary objectForKeyedSubscript:]: нераспознанный селектор»

У меня это работает прямо сейчас, используя Method Swizzling для переназначения NSDictionary objectForKeyedSubscript: на valueForKey: (если он не существует), но я не очень доволен этим обходным путем. Должен быть параметр platform.xml или флаг компилятора, который не будет удалять эти вызовы функций в iOS 5.1, но я ничего не могу найти. Мой

Примечание. Эта проблема может выглядеть примерно так (и некоторые другие, но у меня нет представителя для ссылок), но это не потому, что собственный проект xCode работает нормально, а ANE, скомпилированный с помощью ADT, нет.

Вещи, которые пробовали и терпели неудачу:


ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ

FlashBuilder/AIR: SDK3.7 ADT — версия: 3.7.0.1530

Проект xCode BaseSDK: 6.1 (последняя версия) Допустимые архитектуры: armv7 armv7s Цель развертывания: iOS 5.1

Platform.XML (это довольно долго, так как у него есть некоторые другие требования к поддержке)

<platform xmlns="http://ns.adobe.com/air/extension/3.7">
    <linkerOptions>
    <option>-ObjC</option>
    <option>-weak_framework Accounts</option>
    <option>-framework AddressBook</option>
    <option>-framework AddressBookUI</option>
    <option>-weak_framework AdSupport</option>
    <option>-framework CoreLocation</option>
    <option>-framework CoreMotion</option>
    <option>-framework CoreTelephony</option>
    <option>-framework EventKit</option>
    <option>-framework EventKitUI</option>
    <option>-framework iAd</option>
    <option>-framework MapKit</option>
    <option>-framework MediaPlayer</option>
    <option>-framework MessageUI</option>
    <option>-framework OpenAL</option>
    <option>-weak_framework PassKit</option>
    <option>-framework StoreKit</option>
    <option>-weak_framework Twitter</option>
    <option>-framework UIKit</option>
    <option>-lsqlite3</option>
    <option>-lxml2</option>
    <option>-lz</option>
    </linkerOptions>
</platform>

Команда сборки ADT:

adt -package -target ane build/MyANEName.ane  ANE/extension.xml -swc ANE/MyANEName.swc -platform iPhone-ARM -platformoptions ANE/platform.xml -C ANE/ios .

person Matt Cardoza    schedule 24.05.2013    source источник
comment
Я смущен. Это первые две строки кода, которые вы написали. Если да, то просто используйте вместо этого objectForKey:.   -  person borrrden    schedule 25.05.2013
comment
Есть код, который я не контролирую, который использует objectForKeyedSubscript, вызывающий проблему. Вы правы, если бы это был весь мой код, это не имело бы большого значения.   -  person Matt Cardoza    schedule 02.06.2013


Ответы (1)


У меня была такая же проблема, я решил ее, используя параметр -platformsdk для ADT и указав его на SDK iOS 6.1.

В OSX это находится здесь:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk

Итак, добавьте это в свою команду ADT:

-platformsdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
person mcapraro    schedule 03.09.2013