UIButton:点击时崩溃

时间:2015-04-13 13:11:01

标签: objective-c crash uibutton

前提是我已经读过所有类似的S.O.线程,我没有找到一个很好的解决方案。

我的控制器带有带按钮的imageView,工作正常。

UIImage* image = [UIImage imageNamed:@"background"];
[self.imageView setImage:image];

然后我添加" A",从NSObject派生的接口,带有UIImageView和" B":

A* a = [[A alloc] initWithImageView:self.imageView];
[A loadButtons];

A.H

@interface A : NSObject
@property (nonatomic, strong) UIImageView* imageView;
- (void)loadButton;
@end

A.M

- (id)initWithImageView:(UIImageView*)imageView {
    self = [super init];
    self.myArray = [[NSMutableArray alloc] init];
    self.imageView = imageView;
    return self;
}

- (void)loadButton {
    B* b = [[B alloc] init];
    [self.myArray addObject:b];
    [self.imageView addSubview:b.button];
}

B.h

@interface B : NSObject 
@property (nonatomic, strong) UIButton* button;
@end

B.m

- (id)init {
    self = [super init];
    self.button = [[UIButton alloc] init];
    self.button.frame = CGRectMake(0, 0, 20, 20);
    [self.button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    return self;
}

- (void)buttonClicked:(id)sender {
 ...
}

现在的问题是,当用户单击该按钮时,应用程序崩溃报告控制台上没有错误,但继续在main上运行:

0x10ab52900 <+1282>: movq   0xb56001(%rip), %rax      ; (void *)0x000000010cdfd070: __stack_chk_guard

我无法理解错误在哪里!

如果我直接从主视图控制器添加目标按钮

,则可以正常工作
A* a = [[A alloc] initWithImageView:self.imageView];
[A loadButtons];
for(B* b in a.b) {
    [b.button addTarget:self action:@selector(bClicked:) forControlEvents:UIControlEventTouchUpInside];
} 

1 个答案:

答案 0 :(得分:0)

纯粹看着你的A.h和A.m,有一个问题

- (id)initWithImageView:(UIImageView*)imageView {
    self = [super init];
    self.myArray = [[NSMutableArray alloc] init];
    self.imageView = imageView;
    return self;
}

- (void)loadButton {
    B* b = [[B alloc] init];
    [self.myArray addObject:b];
    [self.imageView addSubview:b.button];
}

在loadButton方法退出后,您的变量b将被释放!因此,即使您将b.button作为子视图添加到self.imageView,单击按钮也会使程序崩溃。

但是在你的第二个例子中,

A* a = [[A alloc] initWithImageView:self.imageView];
[A loadButtons];
for(B* b in a.b) {
    [b.button addTarget:self action:@selector(bClicked:) forControlEvents:UIControlEventTouchUpInside];
} 

不知何故,b是A的属性(为什么我在A.h中看不到)?你修改了吗?如果你修改A.h以包含一个指向B的强指针,那么代码将起作用,因为你的b对象没有被释放。