@autoreleasepool EXC_BAD_ACCESS

#objective-c #cocoa-touch #exc-bad-access #autorelease

#objective-c #cocoa-touch #исключение — плохой доступ #авторелиз

Вопрос:

У меня есть простой UIViewControler, и когда я вызываю метод [self performSelectorInBackground:@selector (загрузить) с помощью object:nil]; это вызывает и EXC_BAD_ACCESS

Вот UIViewControler.m и UIViewControler.h

 #import <UIKit/UIKit.h>
@interface ViewController : UIViewController

@property (strong, nonatomic) UITextView *myTextView;

@end



#import "ViewController.h"

@implementation ViewController

@synthesize myTextView;

- (id)init {
    self = [super init];
    if (self) {
        myTextView = [[UITextView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        [[self view] addSubview:myTextView];
        [self performSelectorInBackground:@selector(load) withObject:nil];
    }
    return self;
}

- (void) load {
    @autoreleasepool {
        [myTextView setText:@"LOADING ..."];
        //DO SOMETHING ....
    }
}

@end
 

PS.:

В проекте используется Objective-C ARC

Комментарии:

1. Какова трассировка стека для сбоя?

Ответ №1:

Объекты UIKit не являются потокобезопасными: вы должны обращаться к ним только в основном потоке. Строка [myTextView setText:@"LOADING ..."]; не может быть безопасно выполнена в фоновом потоке.

Это может быть или не быть причиной, по которой вы получаете EXC_BAD_ACCESS сообщение об ошибке, но, не видя остальной части load метода, я не могу узнать, что еще может быть неправильным.