【发布时间】:2011-11-10 02:18:27
【问题描述】:
这是一个 iOS5 和 ARC 特定的问题。
我在 UIScrollView 中设置了一组 UIView,每个 UIView 都在 UIView 类中声明了自己的 UIButton:
IBOutlet UIButton*button;
@property(nonatomic,strong) UIButton*button;
(我也原来有这个作为保留而不是强,但它没有区别)
我还合成了按钮并在 IB 中将其连接到:
-(IBAction)showArticle:(id)sender;
我将它们全部添加到带有大循环的滚动视图中,具体取决于文章的类型:
NewsScrollLead*view = [[NewsScrollLead alloc]initWithNibName:@"NewsScrollLead" bundle:nil];
[view.view setFrame:CGRectMake(0, 0, 513, 225)];
[view.titleLabel setText:[newsDict objectForKey:@"title"]];
[view.details setText:[self flattenHTML:[newsDict objectForKey:@"description"]]];
[view.source setText:[newsDict objectForKey:@"author"]];
[view.details setFont:[UIFont fontWithName:@"HelveticaNeue-Condensed" size:14]];
[view.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue-BoldCond" size:20]];
[view.source setFont:[UIFont fontWithName:@"HelveticaNeue-Condensed" size:14]];
[self.newsScrollView addSubview:view.view];
这是一个如何创建视图并将其添加到滚动视图的示例。
当我尝试点击一个按钮时,我每次都会收到一个无法识别的选择器错误,而不是 UIButton。使用 NSZombie,按钮已因某种原因被释放。
有什么想法吗?相同类型的 Pre-iOS5 问题已通过保留 UIButton 或包含它的视图来解决,但在 ARC 中没有可用的保留。
【问题讨论】:
-
我发现的一个临时解决方法是像这样以编程方式添加按钮:
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, view.view.frame.size.width, view.view.frame.size.height)];[button setTag:i];[button addTarget:self action:@selector(presentArticle:) forControlEvents:UIControlEventTouchUpInside];[view.view addSubview:button];[view setButton:button];这解决了这个问题,按钮永远不会释放' d,但不是问题的真实答案。 -
你确定是被释放的按钮吗?这真的没有意义。在我看来,您的 NewsScrollLead 视图控制器(按钮的目标?)可能在您显示的内容中被释放。错误中无法识别的选择器是什么?什么是 UIView 子类(NewsScrollLead 看起来像 UIViewController 子类)?
-
在我看来,您创建的 NewsScrollLead*view 没有被保留在任何地方,因此这可能是正在发布的内容。向您的类添加一个数组并将它们添加到数组中,以便您维护它们的句柄并查看是否可以解决问题。
标签: objective-c uiscrollview uibutton ios5 automatic-ref-counting