EXEC_BAD_ACCESS в iOS5 для IBAction - PullRequest
       2

EXEC_BAD_ACCESS в iOS5 для IBAction

0 голосов
/ 02 февраля 2012

Я написал пример кода для нажатия кнопки в xcode 4.2 для iOS5

Вот код

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController


@property(strong,nonatomic) IBOutlet UIButton *button;
-(IBAction)changed;
 @end

.m

#import "FirstViewController.h"

@implementation FirstViewController

@synthesize button=_button;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        // Custom initialization
    }
    return self;
}    

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{

    [_button addTarget:self action:@selector(changed)     forControlEvents:UIControlEventTouchUpInside];
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
-(IBAction)changed
{
    NSLog(@"clicked");

    }
    - (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

@end

Но когда я нажимаю кнопку. Я получаю исключение. как решить эту проблему? то же самое работает в iOS 4.3

Ответы [ 4 ]

1 голос
/ 16 августа 2012

Я нашел решение для моей проблемы.

Основная проблема заключается в том, что, если я создаю объект контроллера представления локально (т. Е. Внутри любого метода) и добавляю его как подпредставление, то при вызове любого IBAction в это время он вызовет исключение, поскольку память для этого viewController освобождается автоматически при локальном объявлении.

1 голос
/ 02 февраля 2012

сначала измените этот код на этот

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view from its nib.
    [_button addTarget:self action:@selector(changed) forControlEvents:UIControlEventTouchUpInside];
}
0 голосов
/ 02 февраля 2012

Я думаю, ему нужно добавить элемент данных и для этой кнопки. Я имею в виду код должен выглядеть следующим образом.

@interface FirstViewController : UIViewController{
  IBOutlet *UIButton *button;
}

@property(strong,nonatomic) IBOutlet UIButton *button;
-(IBAction)changed;
 @end

и попробуйте заменить

@synthesize button = _button;

с

@synthesize button;

в вашем файле .m.

0 голосов
/ 02 февраля 2012

У вас неверная подпись сообщения для вашего действия changed. Должно быть:

- (IBAction)changed:(id)sender

и в строке кода addTarget:

@selector(changed:)

PS: Почему вы используете _button? Я не думаю, что это связано с проблемой, но вы должны использовать вместо self.button. Следует избегать прямого доступа к переменным экземпляра, особенно в этом случае, когда вы позволяете компилятору решать, какое имя должна иметь переменная.

PPS: Как уже упоминалось @InderKumarRathore, вы должны также позвонить [super viewDidLoad] до запуска собственного кода.

...