从代码设计的角度来看,为什么UITextView
的内部实现在其内容经常更改时会使用NSString
而不是NSMutableString
?
答案 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!
}