iOS 用の単純な Adobe ネイティブ拡張機能を作成しています。
それはすべて、UISwitch を表示します。
ただし、その UISwitch (またはこのコードの任意の UIView) で setFrame を試行したり、UISwitch のフレームにアクセスしたりすると、アプリのセグメンテーション違反が発生し、メモリ アクセスが不正にクラッシュします。UISwitch 自体は nil ではありません。これは、setOn の呼び出しが機能し、 setFrameを呼び出したり、中心を設定したり、何らかの方法で配置したりしないと、UISwitch が画面に表示されるためです。
これがコードです。問題の関数は最初のものです: showSwitch()
#import "FlashRuntimeExtensions.h"
#import <UIKit/UIKit.h>
FREObject showSwitch(FREContext context,
void* functionData,
uint32_t argc,
FREObject argv[])
{
int32_t isOn;
FREGetObjectAsInt32(argv[0], &isOn);
id delegate = [[UIApplication sharedApplication] delegate];
UIWindow* window = [delegate window];
// The following will segfault
// UISwitch* switchControl = [[[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];
// This works fine.
UISwitch* switchControl = [[[UISwitch alloc] init] retain];
// This will segfault as well
// [switchControl setFrame:CGRectMake(100, 100, switchControl.frame.size.width, switchControl.frame.size.height)];
[switchControl setOn:(isOn == 1)]; // switchControl is not nil, because this works.
[window addSubview:switchControl];
return NULL;
}
void ContextFinalizer(FREContext context)
{
return;
}
void ContextInitializer(void* extensionData,
const uint8_t* contextType,
FREContext context,
uint32_t* numFunctionsToTest,
const FRENamedFunction** functionsToSet)
{
*numFunctionsToTest = 1;
FRENamedFunction* function = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*1);
function[0].name = (const uint8_t*)"showSwitch";
function[0].functionData = NULL;
function[0].function = &showSwitch;
*functionsToSet = function;
}
void ExtensionInitializer(void** extensionDataToSet,
FREContextInitializer* contextInitializerToSet,
FREContextFinalizer* contextFinalizerToSet)
{
*extensionDataToSet = NULL;
*contextInitializerToSet = &ContextInitializer;
*contextFinalizerToSet = &ContextFinalizer;
}
void ExtensionFinalizer(void* extensionData)
{
return;
}