Проблемы с привязками: вызов базового метода для привязки класса вызывает переопределение метода. Приводит к бесконечной рекурсии
Я работаю над проектом MonoTouch, который использует Cordova. Я создал привязку для Cordova (по мотивам созданного Скоттом Бломквистом).
Я был в состоянии создать экземпляры классов довольно хорошо, в обязательном порядке. Однако, когда я пытаюсь расширить их, я сталкиваюсь с проблемами. Например, если я просто попытаюсь расширить CDVViewController, даже не переопределяя ничего, когда мы доберемся до кода, который создает экземпляр этого расширенного класса, система тихо завершит работу без сообщений об ошибках и следующих строк выхода.
The program 'Mono' has exited with code 0 (0x0).
The program '[5600] ***.vshost.exe: Managed (v4.0.30319)' has exited with code -1 (0xffffffff).
Вот класс яя пытаюсь создать экземпляр
public class WebViewController : CDVViewController
{
}
И здесь's связывание позади этого
[BaseType (typeof (UIViewController))]
interface CDVViewController {
[Export ("webView")]
UIWebView WebView { get; set; }
[Export ("pluginObjects")]
NSMutableDictionary PluginObjects { get; }
[Export ("pluginsMap")]
NSDictionary PluginsMap { get; }
[Export ("settings")]
NSDictionary Settings { get; }
[Export ("whitelist")]
CDVWhitelist Whitelist { get; }
[Export ("loadFromString")]
bool LoadFromString { get; }
[Export ("useSplashScreen")]
bool UseSplashScreen { get; set; }
[Export ("activityView")]
UIActivityIndicatorView ActivityView { get; }
[Export ("imageView")]
UIImageView ImageView { get; }
[Export ("wwwFolderName")]
string WwwFolderName { get; set; }
[Export ("startPage")]
string StartPage { get; set; }
[Export ("commandQueue")]
NSObject CommandQueue { get; set; }
[Export ("commandDelegate")]
NSObject CommandDelegate { get; set; }
[Export ("userAgent")]
string UserAgent { get; }
[Export ("printMultitaskingInfo")]
void PrintMultitaskingInfo ();
[Export ("createGapView")]
void CreateGapView ();
[Export ("newCordovaViewWithFrame:")]
UIWebView NewCordovaView(RectangleF bounds);
[Export ("javascriptAlert:")]
void JavascriptAlert (string text);
[Export ("appURLScheme")]
string AppUrlScheme ();
[Export ("parseInterfaceOrientations:")]
NSArray ParseInterfaceOrientations (NSArray orientations);
[Export ("supportsOrientation:")]
bool SupportsOrientation (UIInterfaceOrientation orientations);
[Export ("getCommandInstance:")]
NSObject GetCommandInstance (string pluginName);
[Export ("registerPlugin:withClassName:")]
void RegisterPluginWithClassName (CDVPlugin plugin, string className);
[Export ("URLisAllowed:")]
bool UrlIsAllowed (NSUrl url);
[Static] [Export ("getBundlePlist:")]
NSDictionary GetBundlePlist (string plistName);
[Static] [Export ("applicationDocumentsDirectory")]
string ApplicationDocumentsDirectory ();
// The following methods and properties come from UIWebViewDelegate, but we can't do multiple inheritance
[Export ("webView:shouldStartLoadWithRequest:navigationType:")]
bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType);
}
CDVViewController.h что я строю привязку для доступнаВот
Любая помощь, которую может предложить каждый, будет принята с благодарностью.
Обновление № 1 По-видимому, это было вызвано ошибкой сегментации. Для тех, кто испытывает это, если вы зайдете на Mac и проверите журнал, вы, вероятно, найдете то же самое. Вы можете сделать это, открыв терминал и введяtail -f /var/log/system.log
по-видимому, именно здесь идут логи для симулятора.
В своем журнале я обнаружил следующее.***
используется для редактирования имени приложения.
Mar 28 16:51:16 macmini1 com.apple.launchd.peruser.55385368[409] (UIKitApplication:com.***.***[0x5ef3][14219]): Job appears to have crashed: Segmentation fault: 11
Mar 28 16:51:16 macmini1 SpringBoard[516]: Application '***' exited abnormally with signal 11: Segmentation fault: 11
Mar 28 16:51:16 macmini1 ReportCrash[14132]: Saved crash report for ***[14219] version ??? (???) to /Users/jstarke/Library/Logs/DiagnosticReports/***_2013-03-28-165116_macmini1.crash
Mar 28 16:51:16 macmini1 ReportCrash[14132]: Removing excessive log: file://localhost/Users/jstarke/Library/Logs/DiagnosticReports/***_2013-03-28-135722_macmini1.crash
Обновление № 2 Я нашел отчеты о сбоях, упомянутых выше. Вот последняя информация о сбоях, включая ветку
Process: *** [29880]
Path: /Users/*/Library/Application Support/iPhone Simulator/*/***.app/***
Identifier: ***
Version: ??? (???)
Code Type: X86 (Native)
Parent Process: launchd [409]
Date/Time: 2013-03-29 11:44:48.882 -0700
OS Version: Mac OS X Server 10.7.5 (11G63)
Report Version: 9
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000000bf7fff7c
VM Regions Near 0xbf7fff7c:
Stack 00000000b050b000-00000000b052c000 [ 132K] rw-/rwx SM=COW
--> Stack 00000000bc000000-00000000bf800000 [ 56.0M] ---/rwx SM=NUL
Stack 00000000bf800000-00000000c0000000 [ 8192K] rw-/rwx SM=COW
Application Specific Information:
iPhone Simulator 358.4, iPhone OS 6.0 (iPhone/10A403)
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_c.dylib
0x954d458c szone_malloc_should_clear + 12
1 libsystem_c.dylib
0x954d566b szone_malloc + 24
2 libsystem_c.dylib
0x9550b962 malloc_zone_malloc + 77
3 libsystem_c.dylib
0x9550c882 malloc + 50
4 libobjc.A.dylib
0x041985c9 class_copyProtocolList + 157
5 CoreFoundation
0x03f72962 __methodDescriptionForSelector + 178
6 CoreFoundation
0x03fe65a3 -[NSObject(NSObject) methodSignatureForSelector:] + 51
7 ***
0x00254352 monotouch_trampoline + 82
8 ???
0x16c4ab0b 0 + 381987595
9 ???
0x16c7428c 0 + 382157452
10 ???
0x16c743dc 0 + 382157788
11 ***
0x0004cf22 mono_jit_runtime_invoke + 722
12 ***
0x001b03fe mono_runtime_invoke + 126
13 ***
0x00255166 monotouch_trampoline + 3686
Lines 8 - 13 repeat a large number of times (no additional information)
506 ???
0x16c4ab0b 0 + 381987595
507 ???
0x16c7428c 0 + 382157452
508 ???
0x16c743dc 0 + 382157788
509 ***
0x0004cf22 mono_jit_runtime_invoke + 722
510 ***
0x001b03fe mono_runtime_invoke + 126
511 ***
0x00255166 monotouch_trampoline + 3686
Обновление № 3 Чтобы получить больше информации, я решил переопределить все методы в CDVViewController в моем локальном WebViewController, а затем вернуть значение из базового эквивалента каждого метода, установить точку останова для метода и поставить консоль. .WriteLine говорит, что мы вошли и вышли из каждого метода.
К моему удивлению, причина многих повторений вОбновление № 2 связано с тем, что когдаWebViewController.ShouldAutoRotateToInterfaceOrientation
называется, мы называем базовый классCDVViewController.ShouldAutoRotateToInterfaceOrientation
который, по-видимому, в свою очередь вызываетWebViewController.ShouldAutoRotateToInterfaceOrientation
, и так далее.
Глядя на исходный код для версии Cordova I 'м с помощью (Вот),shouldAutorotateToInterfaceOrientation:
назвал быsupportsOrientation:
, который бы вернулся из.NSArray
Я могу'не вижу причин, почемуCDVViewController.ShouldAutoRotateToInterfaceOrientation
должен когда-либо звонитьWebViewController.ShouldAutoRotateToInterfaceOrientation
, Кто-нибудь из сообщества Xamarin или Cordova имеет какие-либо идеи?