UIWebView委托中的EXC_BAD_ACCESS

时间:2012-09-06 14:39:19

标签: objective-c ios

我遇到了问题 - 我在尝试设置UIWebView.delegate = self时获得了EXC_BAD_ACCESS;

我的代码:

vkLogin.h -

#import UIKit/UIKit.h

@interface vkLogin : UIViewController <UIWebViewDelegate>
{
    UIWebView *authBrowser;
    UIActivityIndicatorView *activityIndicator;
}

@property (nonatomic, retain) UIWebView *authBrowser;
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;

@end

vkLogin.m -

#import "vkLogin.h"
#import "bteamViewController.h"

@implementation vkLogin

@synthesize authBrowser;

- (void) viewDidLoad
{
    [super viewDidLoad];

    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityIndicator.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
    activityIndicator.autoresizesSubviews = YES;
    activityIndicator.hidesWhenStopped = YES;

    [self.view addSubview: activityIndicator];
    [activityIndicator startAnimating];

    authBrowser = [[UIWebView alloc] initWithFrame:self.view.bounds];

    authBrowser.delegate = self;
    authBrowser.scalesPageToFit = YES;

    [self.view addSubview:authBrowser];

    NSString *authLink = @"http://api.vk.com/oauth/authorize?client_id=-&scope=audio&redirect_uri=http://api.vk.com/blank.html&display=touch&response_type=token";
    NSURL *url = [NSURL URLWithString:authLink];

    [authBrowser loadRequest:[NSURLRequest requestWithURL:url]];

}

- (void) webViewDidFinishLoad:(UIWebView *)authBrowser
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Lol" message:@"OLOLO" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];

    [alert show];

}
@end

所以,如果我赞成委托字符串 - 一切正常,但我没有收到我的webViewDidFinishLoad事件。

我做错了什么?

1 个答案:

答案 0 :(得分:5)

错误不在您发布的代码中。您的僵尸消息说您对vkLogin的引用不好。因此,您需要查看创建的任何类,并保留对vkLogin类的引用。

该课程应该像vkLogin *foo = [[vkLogin alloc] init];

那样做

更新

根据您的评论,您似乎正在为vkLogin创建一个本地变量。看到代码创建并使用vkLogin以及如何调用它将是最有用的。除此之外,这里有一些猜测。

您被称为创建多次vkLogin并将其添加到子视图的方法。 (每次都会创建一个新实例)。 您可以在删除vkLogin后进行某种回调。

我的猜测vkLogin应该是您班级中的property,而不是本地方法变量。

在你的.h中你会添加 @proprerty (strong, nonatomic) vkLogin *vk;

在您的.m文件中,您可以将其称为self.vk,因此您可以创建它并将其添加为子视图,如:

self.vk = [[vkLogin alloc] init]; 
[self.view addSubview:self.vk];

在旁注中,约定说我们应该使用大写字母来启动类名,因此您可以将类命名为VkLogin,这样可以轻松区分名为vkLogin的变量(但在解决问题后担心这一点)