2009-11-26 34 views
5

Mã bên dưới biên dịch và chạy, NHƯNG tùy theo tất cả sách phát triển trên iPhone và tài liệu Apple không nên! Có thể ai đó xin vui lòng giải thích cho tôi như thế nào đến bất biến NSString cho phép thay đổi giá trị của nó sau khi nó đã được thiết lập? Tôi nghĩ rằng tôi đã phải sử dụng NSMuttableString để thay đổi bối cảnh của cùng một biến chuỗi? Tôi đang sử dụng SDK 3.1.NSString không thay đổi cho phép thay đổi giá trị của nó?

NSString *test =[[NSString alloc] initWithString:@"TEST"]; 
[test release]; 
test = @"TEST2"; 

Trả lời

20

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.

+1

+1 để thực sự giải thích và không chỉ trả lời ... –

+1

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? –

+1

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 độ. –

7

Bạn không thay đổi chuỗi, bạn chỉ cần gán lại kiểm tra biến để trỏ đến một chuỗi khác. Chuỗi gốc chưa được sửa đổi.

+0

Ok, có ý nghĩa. Sau đó, ý của chúng có nghĩa là gì bằng cách thay đổi các chuỗi trong obj C? Và tại sao trong mỗi cuốn sách họ nói để tạo chuỗi mới khi gán giá trị mới cho NSString? Cảm ơn bạn! –

+2

Chúng có nghĩa là thay đổi các ký tự riêng lẻ của một chuỗi, ví dụ như thay đổi 'Hello, world!' Thành "Yello, world!" Bằng cách thay đổi ký tự đầu tiên thành "Y" và để phần còn lại không thay đổi. –

7

TEST và TEST2 là hai chuỗi khác nhau được trỏ bởi con trỏ *.

Bạn không thay đổi nội dung của đối tượng NSString được phân bổ rõ ràng từ dòng đầu tiên của mã nhưng chỉ * kiểm tra đối tượng khác.

Các vấn đề liên quan