2010-03-26 47 views
6
NSString *myString = @"sample string"; 
    NSString *newString = [myString copy]; 

Nếu tôi đặt điểm ngắt sau hai dòng này, con trỏ cho myString giống như con trỏ cho newString.Sao chép NSString không sao chép?

WTF? Không phải là bản sao NSString phải trả về một con trỏ đến một đối tượng mới? Hoặc tôi thiếu một cái gì đó cơ bản về cách sao chép là nghĩa vụ phải làm việc?

+0

tôi không biết câu trả lời nhưng nếu bạn thay đổi mystring sau đó cả hai đều có địa chỉ khác ... đến khi nội dung của chuỗi là giống nhau đó là trong cùng một địa chỉ ... –

+2

Trước tiên, bạn đã không thực sự gọi sao chép, bạn gọi là stringWithString :. Thứ hai, vì chuỗi không thay đổi, trình biên dịch và thời gian chạy thực hiện tối ưu hóa. Thông thường các đối tượng không thay đổi sẽ được trả lại với số lượng tham chiếu bổ sung thay vì tạo đối tượng mới thực. –

+0

Làm đẹp cacao - không sao chép dữ liệu khi không cần thiết ... – stefanB

Trả lời

9

NSStringkhông thể thay đổi được nó có thể chỉ tăng nội bộ ref count và được thực hiện với nó.

Khi bạn release một trong những NSStrings đó có thể chỉ giảm ref count - quản lý bộ nhớ tiêu chuẩn.

Bạn có thấy bất kỳ vấn đề nào với điều đó không?

6

Hãy nghĩ về điều này: NSMutableString là một phân lớp của NSString. Khi tài sản của bạn được khai báo là NSString, bạn không mong đợi nó thay đổi.

Hãy xem xét, nếu bạn đã sử dụng retain và ai đó đã cung cấp cho bạn NSMutableString và sau đó sẽ thay đổi nó, lớp học của bạn sẽ bị hỏng.

Tuy nhiên, bạn có thể nghĩ rằng luôn luôn copy ing chậm. Do đó, chỉ cần gọi retain. 's copy tạo một bản sao thực tế.

Tốt hơn là nên nhổ ra một số NSString * vì mọi người sẽ không phải sao chép tất cả thời gian.

1

Đó là một thực hành tốt hơn để làm sao chép các giá trị chuỗi trả về bởi một phương pháp, vì giá trị trả về có thể là một đối tượng chuỗi có thể thay đổi, và giá trị này có thể được sửa đổi trong chủ đề khác sau khi được trả về bởi phương thức đó.

1

Bạn có thể Phân bổ biến mới như trong mẫu

NSString *anotherString = [[NSString alloc] initWithString:originalString]; 
Các vấn đề liên quan