前提是我已经读过所有类似的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];
}
答案 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对象没有被释放。