Có lẽ ví dụ sau sẽ thêm vào các câu trả lời từ Mark và Niels và giúp làm rõ mọi thứ.
chuỗi Immutable
// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;
// "Replace" the second string
str2 = @"Hello ikilimnik";
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
chuỗi Biên Đổi
// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;
// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
Chú ý khi bạn sử dụng lớp NSString bất biến rằng cách duy nhất để "thay thế" một chuỗi là để tạo ra một chuỗi mới và cập nhật biến của bạn "str2" để trỏ đến nó. Tuy nhiên điều này không ảnh hưởng đến những gì "str1" đang trỏ đến, vì vậy nó sẽ vẫn tham chiếu chuỗi gốc.
Trong ví dụ NSMutableString, chúng tôi không tạo chuỗi thứ hai, nhưng thay vào đó thay đổi (thay đổi) nội dung của chuỗi "Hello World" hiện có. Vì cả hai biến tiếp tục trỏ đến cùng một đối tượng chuỗi, chúng sẽ báo cáo cả giá trị mới trong lệnh gọi tới NSLog.
Điều quan trọng là phải phân biệt giữa biến con trỏ và đối tượng thực mà nó trỏ đến. Một đối tượng NSString là không thay đổi, nhưng điều đó không ngăn bạn thay đổi giá trị của một biến trỏ đến một chuỗi.
Kiểu dữ liệu "NSString *" là một con trỏ trỏ đến đối tượng NSString, không phải chính đối tượng đó. Nếu bạn đặt điểm ngắt tại một trong hai câu lệnh NSLog trong trình gỡ lỗi XCode, bạn có thể kiểm tra giá trị thô của mỗi biến để làm rõ điều này.
Nguồn
2009-11-26 21:17:11
+1 để thực sự giải thích và không chỉ trả lời ... –
Cảm ơn bạn Christopher, nhưng những gì về ví dụ như thế này: NSString * str = @ "one"; str = [str stringByAppendingString: @ "two"]; Bạn đang nói rằng mặc dù tôi sử dụng cùng một biến, tôi đang tạo ra hai đối tượng khác nhau? Ngoài ra điều gì sẽ xảy ra với các đối tượng NSString mà chúng ta tạo ra một cách rõ ràng, chúng có được làm sạch bằng tự động không? –
Có điều đó sẽ tạo ra hai đối tượng chuỗi bất biến. "Một" và "onetwo". Một trong những lợi ích của mutable s trings là họ có thể giúp tránh các đối tượng chuỗi tạm thời bổ sung nếu bạn thực hiện một chuỗi rất nhiều hoạt động bổ sung phong cách như ví dụ bạn cung cấp. Điều này có thể giúp tăng tốc độ sử dụng bộ nhớ và tốc độ. –