Uibutton动作不在ARC模式下触发,因为它们在非ARC模式下触发

时间:2016-01-21 10:36:52

标签: ios uibutton loadnibnamed

在View Controller.m中

@interface ViewController ()
{
    CustomView *view;
}

@implementation ViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    view = nil;
    view = [[CustomView alloc]init];

    [self.view addSubview:view];
}

在CustomView.m

-(CustomView *)init
{
    CustomView *result = nil;
    result = [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0];

    return result;
}

我的自定义视图中有两个按钮。 我的自定义视图按预期正常加载但如果为CustomView.m文件启用ARC则不触发按钮操作,如果我禁用ARC然后按钮操作正在触发...

我出错了..

这是加载uiview笔尖的正确方法(我希望在我的项目中的许多地方使用它)。

谢谢..

1 个答案:

答案 0 :(得分:0)

这是init方法的一个非常令人困惑/困惑的实现。

- (CustomView *)init
{
    CustomView *result = nil;
    result = [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0];

    return result;
}

我建议把它改成这样的......

// class method not instance method
+ (CustomView *)loadFromNib {
    return [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0];
}

然后将ViewController方法更改为类似的内容......

@interface ViewController ()

@property (nonatomic, strong) CustomView *customView; // don't call it view, it's confusing

@end

@implementation ViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    self.customView = [CustomView loadFromNib];

    [self.view addSubview:self.customView];
}

您遇到的问题可能来自您将init方法实现为实例方法但随后忽略该实例并返回新实例的方式。

这种记忆含义令人困惑,难以解决。