2

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

4

3 回答 3

5

从一般编码的角度来看:

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

如果属性是一个可变对象,你可以改变它的内容并且控件不会得到任何通知这已经发生了,所以它不知道控件需要被重绘。

于 2009-05-31T23:44:16.860 回答
0

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

于 2009-06-01T00:11:45.227 回答
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!    
}
于 2013-04-21T01:23:58.937 回答