2011-11-03 41 views
6

Tôi thấy nhiều cuộc thảo luận nói rằng tôi nên sử dụng sao chép cho thuộc tính NSString vì nó sẽ ngăn người khác thay đổi nó sau lưng tôi. Nhưng tại sao chúng ta không chỉ thiết lập thuộc tính chỉ đọc cho nó?Sao chép thuộc tính NSString hoặc chỉ đọc?

Cập nhật

Cám ơn trả lời câu hỏi của tôi. Nhưng vấn đề là đối với tài sản NSString, bạn luôn không muốn người khác sửa đổi nó, đúng không? Bạn có thể tự sửa đổi nó nhưng chắc chắn không phải người khác. Tôi đoán hầu hết thời gian NSString có được giá trị ban đầu của nó được thiết lập (hoặc bởi bạn hoặc bởi người khác), sau đó chỉ bạn mới sửa đổi nó. Sau đó, tại sao không chỉ sử dụng thuộc tính chỉ đọc

Thực ra tôi sử dụng hầu hết thời gian. Nhưng sau đó tôi nhận ra hầu hết thời gian tôi chỉ sử dụng những người định cư trong phương pháp init của tôi. Vì vậy, tôi nghĩ rằng tôi nên sử dụng chỉ đọc thay vì sao chép cho những trường hợp đó.

Vì vậy, hãy để tôi đặt câu hỏi theo cách này: nếu bạn chỉ sử dụng những người định cư cho NSStrings của bạn trong phương pháp init của bạn, thì bạn nên sử dụng chỉ đọc thay thế. Đây có phải là một kết luận hợp lý không?

Trả lời

10

nếu bạn chỉ sử dụng những người định cư đó cho NSStrings của bạn trong phương pháp init, thì bạn nên sử dụng chỉ đọc thay thế. Đây có phải là một kết luận hợp lý không?

Vì bạn không nên sử dụng accessors ở các bang được xây dựng một phần (init/dealloc), sau đó bạn nên khai báo nó như copyreadonly, sau đó thực hiện các bản sao trong initializer:

- (id)initWithName:(NSString *)inName 
{ 
    self = [super init]; 
    if (0 != self) { 
    name = [inName copy]; 
    } 
    return self; 
} 

Cụ thể hơn , copyreadonly là các khái niệm ngữ nghĩa khác nhau.

  • Bạn sử dụng copy vì bạn quan tâm đến giá trị trong nhiều trường hợp. Nó cũng là một biện pháp bảo vệ và tối ưu hóa để sử dụng các chuỗi bất biến.

  • Bạn sử dụng readonly để cấm khách hàng đột biến/đặt dữ liệu của bạn.

Cùng nhau, họ cung cấp một mức độ tốt về an toàn, nhưng một mình:

  • copy vẫn cho phép khách hàng để thiết lập giá trị tại bất kỳ điểm nào trong thực hiện chương trình thông qua setter.

  • readonly không bao hàm copy và thuộc tính được giữ lại có thể được thay đổi sau lưng bạn; hãy xem xét điều gì sẽ xảy ra khi bạn được chuyển một biến thể có thể thay đổi được và máy khách sẽ thay đổi nó sau khi gọi setter.

Cách an toàn nhất là sử dụng copyreadonly.

  • rõ ràng, bạn sẽ sử dụng readwrite khi bạn cần phải cung cấp một setter cho các khách hàng của bạn, và bạn ủng hộ sự thay đổi đó.

  • giữ lại một chuỗi (hoặc mảng hoặc ...) thay vì sao chép thường là một ý tưởng tồi. hiếm khi sử dụng tốt để bạn không sao chép các loại này và có thể dẫn đến các lỗi tinh tế. ngay cả khi bạn đang xử lý một loại có thể thay đổi, bạn thường sẽ muốn có một bản sao có thể thay đổi (trình biên dịch sẽ không tổng hợp cho bạn). giữ lại hoặc gán các loại này hầu như không bao giờ bạn muốn. một ngoại lệ mà tôi thực hiện là khi xử lý phân bổ lớn, nơi dữ liệu được đóng gói tốt (ví dụ: trường hợp NSMutableData nặng mà tôi chuyển quyền sở hữu từ nơi này sang nơi khác để tránh sao chép).

+0

Cảm ơn bạn đã cập nhật câu hỏi của mình. – Qiulang

+0

Bạn được chào đón =) – justin

+1

"Cách an toàn nhất là sử dụng bản sao và chỉ đọc". Nhưng không phải là nhầm lẫn khách hàng của bạn? chỉ đọc có nghĩa là không có setter, trong khi bản sao có nghĩa là có một setter? Tất nhiên khách hàng của bạn sẽ suy luận thêm rằng bạn thêm ghi đè vào tệp .m của bạn, nhưng tuyên bố sao chép và chỉ đọc vẫn khiến tôi bối rối ngay từ cái nhìn đầu tiên. – Qiulang

6

Nếu bạn không muốn người khác sửa đổi thuộc tính của mình, thì bạn hoàn toàn nên đánh dấu nó readonly. Những gì mọi người muốn nói khi sử dụng copy có nghĩa là không thể thay đổi chuỗi sau lưng, nếu ai đó chỉ định chuỗi cho thuộc tính của bạn và chuỗi có thể thay đổi và sau đó họ thay đổi chuỗi, sau đó bạn truy cập thuộc tính của mình sẽ quay lại số đã thay đổi chuỗi. Nhưng nếu bạn sử dụng copy thì bạn sẽ lấy lại ảnh chụp nhanh về cách chuỗi được xem xét thời gian nó được gán cho thuộc tính (đó là những gì mọi người mong đợi xảy ra).

+0

Cảm ơn bạn đã trả lời câu hỏi của mình. Nhưng vấn đề là đối với tài sản NSString, bạn luôn không muốn người khác sửa đổi nó, đúng không? Những người khác có thể đặt những giá trị ban đầu NSStrings, nhưng bạn không muốn họ sửa đổi nó, phải không? – Qiulang

+1

@Qiulang: Khá thường xuyên, bạn muốn người khác có thể chỉ định cho tài sản của bạn. Nó thực sự phụ thuộc vào những gì lớp học của bạn đang làm và những gì tài sản đại diện. –

0

Bạn có thể làm cả hai. Bởi vì NSString là không thay đổi, chuỗi cơ bản không thể thay đổi được. Bạn có thể không muốn tham chiếu thay đổi, đó là lý do tại sao bạn sử dụng chỉ đọc.

Bản sao chỉ áp dụng cho setter, getter sẽ vẫn trả lại tham chiếu chứ không phải bản sao.

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