通过函数初始化实例变量

时间:2013-09-25 04:11:09

标签: ios objective-c pointers

我有一堆UILabel需要全部设置相同但具有不同的帧。由于其中有很多我认为我会通过创建函数来降低代码量:

-(void)addField:(UILabel *)label withFrame:(CGRect)frame toView:(id)view {
    label = [[UILabel alloc] initWithFrame:frame];
    label.layer.cornerRadius = 3;
    [view addSubview:label];
}

并通过以下方式调用:

[self addField:fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView];

这可以说明字段正确显示但是查看它fieldOneLabel没有初始化所以它只是不再引用那里的UILabel。我以为我可能不得不使用&但我想我的理解是不正确的,因为它会导致编译错误。我该怎么办?

3 个答案:

答案 0 :(得分:3)

您可能想要返回标签,然后将其添加到UIView中,如下所示:

-(UILabel*)createLabelWithText:(NSString*)text andFrame:(CGRect)frame {
    UILabel *label = [[UILabel alloc] initWithFrame:frame];
    [label setText:text];
    label.layer.cornerRadius = 3;
    return label;
}

然后在您的代码中,您可以执行以下操作:

UILabel *xLabel = [self createLabelWithText:@"Some Text" andFrame:CGRectMake(20, 180, 61, 53)];
[theView addSubview:xLabel];

或者您希望以后作为属性访问它:

self.xLabel = [self createLabelWithText:@"Some Text" andFrame:CGRectMake(20, 180, 61, 53)];
[theView addSubview:xLabel];

答案 1 :(得分:1)

-(void)addField:(UILabel * __autoreleasing *)fieldOneLabel withFrame:(CGRect)frame toView:(id)view {
    if (fieldOneLabel != nil) {
        *fieldOneLabel = [[UILabel alloc] initWithFrame:frame];
        (*fieldOneLabel).layer.cornerRadius = 3;
        [view addSubview:(*fieldOneLabel)];
    }
}

并通过以下方式调用:

[self addField:&fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView];

使用__autoreleasing可以避免电弧存储器问题

答案 2 :(得分:0)

我将其更改为不将UILabel发送到该函数,但返回创建的标签:

-(UILabel *)addFieldWithFrame:(CGRect)frame toView:(id)view {
    UILabel *label = [[UILabel alloc] initWithFrame:frame];
    label.layer.cornerRadius = 3;
    [view addSubview:label];
    return label;
}

并通过以下方式致电:

fieldOneLabel = [self addFieldWithFrame:CGRectMake(self.view.bounds.size.width / 2 - 128, 13, 61, 53) toView:view];

虽然类似于Scotts的回答,但我想避免在另一条线上添加视图。