绑定问题:在绑定类上调用基方法调用覆盖方法.导致无限递归 [英] Issues with Bindings: Calling base method on binding class calls override method. Leads to infinite recursion

查看:15
本文介绍了绑定问题:在绑定类上调用基方法调用覆盖方法.导致无限递归的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个使用 Cordova 的 MonoTouch 项目.我为 Cordova 创建了一个绑定(基于 Scott Blomquist 创建的绑定a>).

I'm working on a MonoTouch project that uses Cordova. I created a binding for Cordova (based on the one created by Scott Blomquist).

我已经能够很好地实例化这些类而不会失败.然而,当我尝试扩展它们时,我遇到了问题.例如,如果我只是尝试扩展 CDVViewController,甚至没有覆盖任何东西,当我们到达实例化这个扩展类的代码时,系统会安静地退出,没有错误消息,以及以下退出行.

I have been able to instantiate the classes fairly well without fail. When I try to extend them however, I run into issues. For example, if I merely try extend the CDVViewController, without even overriding anything, when we get to the code that instantiates this extended class, the system quietly exits with no error messages, and the following exit lines.

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
{
}

这是它背后的绑定

[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我构建绑定的可用here

任何人都可以提供的任何帮助将不胜感激.

Any help that anyone can offer would be greatly appreciated.

更新 #1这似乎是由分段错误引起的.对于遇到此问题的任何其他人,如果您转到 Mac 并检查日志,您可能会发现相同的情况.您可以通过打开终端并输入 tail -f/var/log/system.log 来执行此操作,因为这显然是模拟器日志所在的位置.

Update #1 This appears to have been caused by a segmentation fault. For anyone else experiencing this, if you go onto the Mac and check the log, you will likely find the same. You can do this by opening the terminal, and typing in tail -f /var/log/system.log as apparently this is where the logs for the simulator go.

在我的日志中,我发现了以下内容.*** 用于编辑应用程序名称.

In my log, I found the following. *** is used for redacting the application name.

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我找到了上面提到的崩溃报告.这里是最新的崩溃报告信息,包括崩溃线程

Update #2 I found the crash reports mentioned above. Here is the latest crash report information, including the crashed thread

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为了获得更多信息,我决定在本地 WebViewController 中覆盖 CDVViewController 中的所有方法,然后从每个方法的基本等效项返回值,并在该方法上设置断点,并放置一个控制台.WriteLine 表示我们进入和退出每个方法.

Update #3 In an effort to get some more information, I decided to override all of the methods in the CDVViewController within my local WebViewController, and then return the value from the base equivalent of each method, and set a breakpoint on the method, and put a Console.WriteLine saying that we entered and exited each method.

令我惊讶的是,Update #2 中有许多重复的原因与以下事实有关,即当调用 WebViewController.ShouldAutoRotateToInterfaceOrientation 时,我们调用基class CDVViewController.ShouldAutoRotateToInterfaceOrientation,它显然又调用了WebViewController.ShouldAutoRotateToInterfaceOrientation,等等.

To my surprise, the reason for the many many duplications in Update #2 has to do with the fact that when WebViewController.ShouldAutoRotateToInterfaceOrientation is called, we call the base class CDVViewController.ShouldAutoRotateToInterfaceOrientation, which apparently in turn calls WebViewController.ShouldAutoRotateToInterfaceOrientation, and so on.

查看我正在使用的 Cordova 版本的源代码 (here),shouldAutorotateToInterfaceOrientation: 会调用 supportsOrientation:,它会从 NSArray 返回.

Looking at the source code for the version of Cordova I'm using (here), shouldAutorotateToInterfaceOrientation: would call supportsOrientation:, which would return from an NSArray.

我看不出为什么 CDVViewController.ShouldAutoRotateToInterfaceOrientation 应该调用 WebViewController.ShouldAutoRotateToInterfaceOrientation 的任何理由.Xamarin 或 Cordova 社区中的任何人有任何想法吗?

I can't see any reason why CDVViewController.ShouldAutoRotateToInterfaceOrientation should ever call WebViewController.ShouldAutoRotateToInterfaceOrientation. Does anyone in the Xamarin or Cordova community have any idea?

推荐答案

如果其他人遇到与绑定相关的类似问题,我在 Rolf Bjarne Kvinge (绑定问题:扩展类导致调用自身的方法?)

If anyone else is experiencing a similar issue relating to Bindings, I managed to get this working thanks to the advice of Rolf Bjarne Kvinge (Binding issues: extending a class leads method calling itself?)

事实证明,这要归咎于我使用的标志(没有真正理解它的作用).当使用 btouch 生成 DLL 时,-e 标志 生成不能被子类化的较小类.

It turns out that a flag that I was using (without really understanding what it did) was to blame for this. When generating the DLL using btouch the -e flag Generates smaller classes that can not be subclassed.

删除它可能会解决您的问题,就像对我一样.

Removing this will likely solve your problem, like it did for me.

这篇关于绑定问题:在绑定类上调用基方法调用覆盖方法.导致无限递归的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆