为什么UITextView使用字符串而不是可变字符串作为其文本属性?

时间:2009-05-31 22:20:32

标签: iphone cocoa-touch uitextview

从代码设计的角度来看,为什么UITextView的内部实现在其内容经常更改时会使用NSString而不是NSMutableString

3 个答案:

答案 0 :(得分:5)

从一般编码的角度来看:

设置属性时,将调用属性setter方法。这样控件就能够注意到属性何时被更改,以便它可以使用新内容重绘控件。

如果属性是可变对象,则可以更改其内容,并且控件不会收到任何已发生的通知,因此它不知道需要重新绘制控件。

答案 1 :(得分:0)

这是Cocoa中传递不可变对象的一般模式,而不是允许外部类访问私有可变变量。你会在NSArray和NSDictionary这样的集合类中看到同样的东西。

答案 2 :(得分:0)

当然,没有理由你不能改变它指向的东西!因为该成员只是一个指针,所以如果需要,可以自己用NSMutableString替换该字符串。

如果您想在视图中添加大量文本,这可能是一种更有效的方法。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [myTextView setText:[[NSMutableString alloc] init]];
    }
    return self;
}

请确保仍然调用setText,因为正如@Guffa在他的回答中解释的那样,否则视图将无法重新绘制。

- (void)appendText:(NSString*)text 
{
    NSMutableString *dispText = (NSMutableString*)[myTextView text];
    [dispText appendString:text];

    [myTextView setText:dispText]; // notify myTextView of text change!    
}