带有 Web 视图的模态视图使 iOS7 中的应用程序崩溃

Posted

技术标签:

【中文标题】带有 Web 视图的模态视图使 iOS7 中的应用程序崩溃【英文标题】:Modal view with Web view makes an app crash in iOS7 【发布时间】:2013-12-19 15:24:50 【问题描述】:

我已经用 Objective-C 开发了两个月,所以我对这种语言和 ios 环境还是很陌生。我正在将一个适用于 iOS6 的应用更新到 iOS7。

当显示带有 Web 视图的模态视图时,我收到下一个错误,仅在 iOS7 中,这在 iOS6 中有效。里面有一个 URL 请求,但我找不到导致错误的原因。

'-[__NSMallocBlock__ absoluteURL]: unrecognized selector sent to instance 0x16e8b020'

这是模态视图控制器上的 viewWillAppear 方法:

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    if (!self.webView.request) 
        //THE NEXT LINE THROWS THE ERROR
        NSURLRequest *req = [[NSURLRequest alloc] initWithURL:self.initialURL];
        [self.webView loadRequest:req];
    

也许我在做一些愚蠢的事情,但现在我真的不知道在哪里看。

如果有人以前经历过类似的事情,我将不胜感激。提前致谢。

编辑:

@interface MyViewController ()
@property (copy, nonatomic) NSURL *initialURL;
@end

@implementation MyViewController

- (id)initWithURL:(NSURL *)initialURL

    self = [super init];
    if (self) 
        _initialURL = initialURL;

        _webView = [[UIWebView alloc] init];
        _webView.backgroundColor = [UIColor clearColor];
        _webView.opaque = NO;
        _webView.delegate = self;
        [self.view addSubview:_webView];

        self.modalPresentationStyle = UIModalPresentationFormSheet;
        self.view.backgroundColor = [UIColor whiteColor];
    
    return self;

方法调用:

self.modalWebViewController = [[[MyViewController alloc] initWithURL:url] autorelease];

【问题讨论】:

什么是 self.initialURL、NSString 或 NSURL self.initialURL的数据类型是什么? self.initialURL 是 NSURL 的类型 我们能看到self.initialURL被初始化/设置的代码吗? 如何确定调试器中的值?尝试在 if 行设置 ab 断点,然后在调试器中输入 po self.initialURL 并逐字告诉我们结果是什么。 【参考方案1】:

我假设 iOS 在传递给 initWithURL: 方法的 self.initialURL 对象上调用 absoluteURL。但是,接收到这个消息的对象是NSMallocBlock,所以好像有问题。我假设您的self.initialURL 对象应该是NSURL 类型。如果是这样,这将表明内存管理问题导致self.initalURL 的指针指向内存中的其他位置(而不是您希望它指向的对象)。

您可以尝试使用 NSZombiesEnabled 运行您的应用程序,这可以防止任何对象被实际释放,而是在仍然访问已删除的对象时向您发出警告。 您可以在方案中激活 NSZombies 来运行您的应用程序(在 Xcode 右上角的工具栏中单击应用程序的名称,然后从弹出菜单中选择“编辑方案...”)。在“诊断”选项卡的运行配置中,有一个用于激活僵尸对象的复选框。

【讨论】:

谢谢,我去试试。 这不起作用,这使得 self.initialURL 变量为 NULL 你是什么意思它“使它为 NULL”?您确定您刚刚激活了该复选框并再次运行它吗? 在 iOS 7 上激活此选项运行应用程序会给我一个 null self.initialURL 变量,而在 iOS6 中运行它可以正常工作。 不,我不知道这些变化。您是否在模拟器上进行了两次运行?或者您是否使用了两种不同的设备? iPhone 新的 64 位处理器的内存管理实现可能存在差异。或者您是否使用了自己代码的不同版本,例如 #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000,这会导致您的代码有两个不同版本,而 iOS 7 版本存在内存错误?

以上是关于带有 Web 视图的模态视图使 iOS7 中的应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

从模态视图控制器 ios7 更改选项卡栏应用程序的选定索引

ios7状态栏在模态视图上变回黑色? [复制]

模态视图的 iOS7 状态栏字体颜色

iOS 7 半透明模态视图控制器

模态视图导航栏的位置 - iOS7

带有 Bootstrap 模态视图的 Rails 应用程序,包含表单、提交和消失模态视图,无需重新加载页面