2012-09-06 3 views
4

문제가 있습니다 - UIWebView.delegate = self를 설정할 때 EXC_BAD_ACCESS가 표시됩니다.UIWebView 대리인의 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 - 내가 위임 문자열 commeting있어 경우에 따라서

#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 

- 모든 것을 잘 작동하지만, 나는 didn를 내 webViewDidFinishLoad 이벤트를 수신하지 못합니다.

내가 뭘 잘못하고있어?

+1

질문 제쳐두고, 100,000 개의 objective-c 태그 질문에 대한 축하합니다! – TheAmateurProgrammer

+0

이렇게 'authlink'를 지정하고 다시 시도하십시오 :'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 "; ' – Adam

+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이라는 변수와 쉽게 구별 될 수 있습니다 (단, 문제를 해결 한 후에는 걱정하지 마십시오)

+0

예, 저는 ARC를 사용하고 있습니다. 그리고 예, 게시했습니다 : vkLogin * vk = [[vkLogin alloc] init]; [자기.보기 addSubView : vk]; – Danny

+0

오, 정말 고마워요! 이것은 정말로 도움이되었습니다. 나는 당신의 메모를 얻었습니다. 이제 대문자로 클래스 이름을 시작하겠습니다. :) – Danny