xamarin.ios - Problemas con los enlaces: método básico de llamada en el método de anulación de llamadas de clase de enlace. Lleva a la recursión infinita
cordova cordova-2.0.0 (1)
Estoy trabajando en un proyecto MonoTouch que usa Cordova. Creé un enlace para Cordova ( basado en el creado por Scott Blomquist ).
He podido crear instancias de las clases bastante bien sin falta. Sin embargo, cuando trato de extenderlos, me encuentro con problemas. Por ejemplo, si simplemente intento extender CDVViewController, sin anular nada, cuando lleguemos al código que ejemplifica esta clase extendida, el sistema sale silenciosamente sin mensajes de error, y las siguientes líneas de salida.
The program ''Mono'' has exited with code 0 (0x0).
The program ''[5600] ***.vshost.exe: Managed (v4.0.30319)'' has exited with code -1 (0xffffffff).
Aquí está la clase que intento crear una instancia
public class WebViewController : CDVViewController
{
}
Y aquí está el enlace detrás de él
[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);
}
El CDVViewController.h para el que creo el enlace está disponible aquí
Cualquier ayuda que cualquiera pueda ofrecer sería muy apreciada.
Actualización # 1 Esto parece haber sido causado por un error de segmentación. Para cualquier otra persona que experimente esto, si vas a la Mac y verificas el registro, es probable que encuentres lo mismo. Puede hacerlo abriendo el terminal y escribiendo tail -f /var/log/system.log
ya que aparentemente aquí es donde van los registros del simulador.
En mi registro, encontré lo siguiente. ***
se usa para redactar el nombre de la aplicación.
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
Actualización # 2 Encontré los informes de fallos mencionados anteriormente. Aquí está la última información del informe de bloqueo, incluido el hilo bloqueado
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
Actualización n. ° 3 En un esfuerzo por obtener más información, decidí anular todos los métodos en el CDVViewController dentro de mi WebViewController local, y luego devolver el valor del equivalente base de cada método, y establecer un punto de interrupción en el método, y poner Console.WriteLine diciendo que ingresamos y salimos de cada método.
Para mi sorpresa, el motivo de las numerosas duplicaciones en la Actualización 2 tiene que ver con el hecho de que cuando se llama a WebViewController.ShouldAutoRotateToInterfaceOrientation
, llamamos a la clase base CDVViewController.ShouldAutoRotateToInterfaceOrientation
, que aparentemente a su vez llama a WebViewController.ShouldAutoRotateToInterfaceOrientation
, y así sucesivamente. .
Mirando el código fuente para la versión de Cordova que estoy usando ( aquí ), shouldAutorotateToInterfaceOrientation:
llamaría supportsOrientation:
que regresaría de un NSArray
.
No veo ninguna razón por la cual CDVViewController.ShouldAutoRotateToInterfaceOrientation
deba llamar alguna vez a WebViewController.ShouldAutoRotateToInterfaceOrientation
. ¿Alguien en la comunidad Xamarin o Cordova tiene alguna idea?
Si alguien más está experimentando un problema similar relacionado con Bindings, logré hacerlo funcionar gracias al consejo de Rolf Bjarne Kvinge ( Problemas vinculantes: ¿se está extendiendo un método de leads de clase? )
Resultó que una bandera que estaba usando (sin entender realmente lo que hacía) era la culpable de esto. Al generar el archivo DLL utilizando btouch
el btouch
-e
Generates smaller classes that can not be subclassed
.
Eliminar esto probablemente resolverá su problema, como lo hizo por mí.