【问题标题】:Accessing self.view.frame in loadView causes EXC_BAD_ACCESS crash在 loadView 中访问 self.view.frame 会导致 EXC_BAD_ACCESS 崩溃
【发布时间】:2011-08-20 20:26:18
【问题描述】:

我在视图控制器中有以下内容(其中webViewUIWebView 类型的实例变量):

- (void)loadView
{
    webView = [[UIWebView alloc]initWithFrame:self.view.frame];
    [self.view addSubview:webView];
}

第一行,分配 web 视图,导致崩溃 -- 我在控制台中收到 EXC_BAD_ACCESS 和一条消息:

警告:无法恢复之前选择的帧

我不明白导致崩溃的原因; self.view.frame 绝对是CGRect

【问题讨论】:

  • 您最好始终提供崩溃日志。没有它很难说。
  • 控制台显示“警告:无法恢复之前选择的帧。”并且分配 UIWebView 的代码行以绿色突出显示并显示“EXC_BAD_ACCESS”。

标签: iphone objective-c ios xcode


【解决方案1】:

你不能在loadView中使用self.viewaccessor,你只能使用setter。原因是 UIViewController 中的 view 访问器方法会加载视图(如果尚未加载),并且由于您已经在 loadView 中(正在加载视图),它将导致无限递归循环。

如果您遵循 loadView from this answer 的模式,您可能希望这样做:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];   // don't forget to release

【讨论】:

    【解决方案2】:

    由于您使用的是 loadView 方法,因此您必须手动创建自己的视图层次结构。由于 UIWebView 是 UIView 的子类,因此您可以像这样编写 loadView 方法:

    webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    self.view = webView;
    [webView release];
    

    或者您可以跳过使用 loadView 并将其放在 viewDidLoad 方法中,如下所示:

    webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.view addSubview:webView];
    [webView release];
    

    为了进一步说明您的应用程序崩溃的原因,当 UIViewController 被实例化时,它的视图并没有以正确的方式创建。这称为延迟加载,因此您正在尝试访问一个尚不存在的值。

    【讨论】:

    • 别忘了 webView 的发布
    【解决方案3】:

    您正在尝试访问视图的框架,甚至没有创建视图。您可以创建一个视图并将其指定为self.view,或者您可以简单地调用[super loadView]。试试下面的代码。

    - (void)loadView {
    
        [super loadView];
        webView = [[UIWebView alloc] initWithFrame:self.view.frame];
        [self.view addSubview:webView];
    }
    

    【讨论】:

    【解决方案4】:

    我认为 self.view.frame 在调用 loadView 时不存在。您可以将该代码放在viewDidLoad 中,其中self.view 已加载且框架已知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-25
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      相关资源
      最近更新 更多