【问题标题】:Adding NSObject to view - UIButton selector in NSObject causes crash将 NSObject 添加到视图 - NSObject 中的 UIButton 选择器导致崩溃
【发布时间】:2012-10-15 11:29:33
【问题描述】:

在 ARC 环境中有一点问题。创建一个将视图添加到父视图的 NSObject - 它基本上是一个“弹出类”,可以处理一些文本并显示它。

在视图控制器中它被实例化..

CBHintPopup *popup = [[CBHintPopup alloc]init];
[popup showPopupWithText:@"test text" inView:self.view];

还有实际的类文件..

CBHintPopup.h

@interface CBHintPopup : NSObject {

}

-(void)showPopupWithText:(NSString *)text inView:(UIView *)view;
-(IBAction)closePopup;

@property (nonatomic, strong) UIView *popupView;
@property (nonatomic, strong) UIImageView *blackImageView;
@property (nonatomic, strong) UIButton *closeButton;

@end

CBHintPopup.m

@implementation CBHintPopup
@synthesize  popupView,blackImageView, closeButton;

-(void)showPopupWithText:(NSString *)text inView:(UIView *)view {

//CREATE CONTAINER VIEW
self.popupView = [[UIView alloc]initWithFrame:CGRectMake((view.frame.size.width/2)-(225/2),-146,225,146)];
self.popupView.alpha = 0;
self.popupView.backgroundColor = [UIColor clearColor];

//CREATE AND ADD BACKGROUND
UIImageView *popupBackground = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,225,146)];
popupBackground.image = [UIImage imageNamed:@"hintbackground.png"];
[self.popupView addSubview:popupBackground];

//CREATE AND ADD BUTTON
self.closeButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.closeButton addTarget:self action:@selector(closePopup) forControlEvents:UIControlEventTouchUpInside];
[self.popupView addSubview:self.closeButton];

//CREATE AND ADD LABEL
UILabel *popupTextLabel = [[UILabel alloc]initWithFrame:CGRectMake(22,25,176,93)];
popupTextLabel.text = text;
[self.popupView addSubview:popupTextLabel];


[view addSubview:self.popupView];
}

-(void)closePopup {
NSLog(@"HI");
}

通过按下按钮调用 closePopup 后接收以下内容(不打印“HI”)..

-[CBHintPopup performSelector:withObject:withObject:]: message sent to deallocated instance 0x246b2fe0

我尝试在非 ARC 和其他方法中保留按钮,但只是没有运气。可能是一些非常简单的事情,但我无法确定它。我已经删除了标签和图像等的所有设置以节省一些空间,所以忽略 alpha 等。

任何帮助将不胜感激,感谢您的宝贵时间。

【问题讨论】:

  • 尝试调试看看是哪一行崩溃了
  • 它并没有完全崩溃,因为其中一个涉及的对象(可能是按钮)已被释放。
  • 请在初始化 CBHintPopup 的位置发布代码

标签: iphone xcode uibutton selector nsobject


【解决方案1】:

你是否为CBHintPopup实现了构造函数,因为你已经调用了构造函数

[[CBHintPopup alloc]init];

你必须像这样实现构造方法

在 CBHintPopup 的 .m 文件中

-(id)init{

if(self == [super init]){

// do some initialization here

   }
  return self;

}

【讨论】:

  • 抱歉,代码示例中没有包含它,但是我确实有这个方法(虽然它实际上并没有进行任何初始化)。
  • 在 .h 和 .m 文件中将 -(IBAction)closePopup 更改为 -(void)closePopup
【解决方案2】:

我试过你的代码,发现你提到的崩溃。我找到了修复崩溃的解决方案。 我在viewController 的界面中声明了CBHintPopup *popup;。并更改了这一行

CBHintPopup *popup = [[CBHintPopup alloc]init];

到

popup = [[CBHintPopup alloc]init];

对我来说一切都很好。但我找不到这背后的原因。希望这会对你有所帮助。

【讨论】:

  • 是的,它确实帮助了我。虽然我不知道为什么。
【解决方案3】:

找到了一个修复方法——我没有将 CBHintPopup 变成一个 NSObject,而是将其设为 UIView 的子类并将 self 添加到父视图(而不是 self.popupView)。不过,我不会真正将其称为“修复”-更多的是一种替代方法。当然,NSObject 可以毫无问题地将 UIView(带有 UIBUtton)添加到父视图?这是一个错误吗?

【讨论】:

    【解决方案4】:

    确保您保留了 CBHintPopup 类的对象。

    我认为崩溃即将到来,因为CBHintPopup 的对象被释放。因此找不到动作方法。

    【讨论】:

    • 抱歉,将两者都更改为 IBAction 已进行了一半 - 不幸的是,仍然会产生相同的错误。整个项目是 ARC 并且很容易有 10,000 行代码,不幸的是我无法保留该对象。我尝试将 CBHintpopup 标记为编译为非 ARC (-fno-objc-arc),但它不起作用。难倒!
    • 真的吗?一,文档说返回类型应该是void,二,IBAction 是typedefed to void。这个“答案”是完全错误的。
    • @H2CO3 感谢您的澄清。我认为 .h 和 .m 中的返回类型应该相同。但在这种情况下没关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多