在类之间传递NSString

时间:2011-06-29 16:15:55

标签: iphone

所以我对将NSString传递给类感到困惑。我有一个绘制一个小盒子的传奇类,并且盒子上有一个标签。我的框本质上是一个UIView对象,我在其中更改背景颜色。在我的init方法中,我初始化该框,然后从我创建此类实例的其他类中设置背景颜色。但是,在NSString的情况下,我不知道如何alloc / init,并从另一个类设置其文本。这是我的传奇代码。

- (id)sharedInit {
    self.backgroundColor = [UIColor clearColor];

    self.LegendBox = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height / 2 - LEGEND_SIZE / 2, LEGEND_SIZE, LEGEND_SIZE)]; // hugs LHS, centered vertically

    self.LegendLabel = [[NSString alloc] init];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25, 0, self.bounds.size.width - 25, self.bounds.size.height)]; 
    label.textColor = [UIColor whiteColor];
    label.backgroundColor = [UIColor clearColor];
    label.text = self.LegendLabel;
    label.font = [UIFont fontWithName:@"Arial" size:14.0];
    label.numberOfLines = 5;
    label.lineBreakMode = UILineBreakModeWordWrap;

    [self addSubview:label];
    [self addSubview:_legendBox];

    return self;
}

然后当我尝试在我的另一个类中创建一个legend类的实例时:

PieChartLabelView *labelView1 = [[PieChartLabelView alloc] initWithFrame:CGRectMake(0, 0, 140, 80)];
labelView1.LegendBox.backgroundColor = BLUE_COLOR;
NSString *str1 = [[NSString alloc] initWithFormat:@"as;flkasjdf;laksjdf"];
labelView1.LegendLabel = str1;

[self addSubview:labelView1];
 [str1 release];
[labelView1 release];

我的标签没有任何文字。

我试图更好地理解自我/ ivars / setter / getters的第二个问题是在我的传奇课程中,为什么我可以使用

[self addSubview:_legendLabel];

与self.LegendLabel?我还是完全不明白。感谢。

2 个答案:

答案 0 :(得分:1)

第二部分

首先回答你的第二个问题,

[self addSubview:_legendLabel];

[self addSubview:self.legendLabel];
如果你没有进行任何惰性实例化,

应该是相同的。大多数情况下,getter方法会检索该值,因此您应该采用第一种方法。但是,如果您通过定义自己的getter方法来执行任何惰性实例化,您可以执行此类操作,

- (UILabel *)legendLabel {
    if ( !_legendLabel ) {
        // Instantiate _legendLabel
    }

    return _legendLabel;
}

如果你没有self.legendLabel,它会有不同的含义。

第一部分

这是您的第二个问题增加了一些混乱的地方,当您尝试在第二个问题中将其添加为子视图时,您似乎将LegendLabel称为NSString变量。

然而,你似乎期待着这一点 -

labelView1.LegendLabel = str1;

更改标签文字,因为您在sharedInit方法 -

中执行此操作
label.text = self.LegendLabel;

这不会影响标签文本,原因有两个,

  1. 如果标签的text属性和LegendLabel都指向同一个对象,那么您需要该对象是可变的,以便更改反映在标签上。如果您重新分配LegendLabel,则它们都会指向两个不同的对象。
  2. 大多数时候NSString属性被声明为copy属性以防止可变性。因此,即使LegendLabel可变,也无法更改标签的文本。
  3. 这意味着您必须使标签成为实例变量或属性,以便您可以直接访问标签并更新它的text属性或重写LegendLabel的setter方法来更新标签

    但是我认为将标签声明为属性是采取的方法,而LegendLabel的命名有点令人困惑。如果它是一个标签会更好。

答案 1 :(得分:0)

创建NSString时,您应该直接这样做:

NSString *str1 = @"ñalskdfjsdañlkfj";

如果你想使用一种格式,你可以这样做:

NSString *str2 = [NSString stringWithFormat:@"This is string %d", 2];

如果你想将它作为一个类中的属性使用,你应该这样声明:

@property (copy) NSString *str3;