@interface SomeClass : NSObject
@property (copy, nonatomic) NSString *usefulString;
@property (strong, nonatomic) NSString *dangerousString;
@property (copy, nonatomic) NSURL *curiousURLOne;
@property (strong, nonatomic) NSURL *curiousURLTwo;
@end
Trong lớp học trên, dangerousString
được coi là ý tưởng tồi bởi vì NSMutableString
được kế thừa từ NSString
. Có nghĩa là có thể người dùng trong lớp của bạn có thể đặt chuỗi có thể thay đổi thành dangerousString
và sau đó thay đổi giá trị của chuỗi có thể thay đổi từ bên dưới phiên bản SomeClass
. Thuộc tính usefulString
không có nguy cơ này vì nó sao chép giá trị vào một đối tượng chuỗi (không thay đổi) mới.NSURL - Không có phân lớp có thể thay đổi, vì vậy không cần phải "sao chép" dưới dạng thuộc tính?
Tuy nhiên, có vẻ như đối với NSURL
(và bất kỳ lớp nền tảng nào khác không có đối tác có thể thay đổi - ví dụ: NSNumber
) ngữ nghĩa sao chép của khai báo thuộc tính là không cần thiết. NSURL
không phù hợp với NSCopying của copyWithZone:
(... nhưng tôi phải tự hỏi, nếu nó không chỉ trả lại đối tượng cùng với một tăng count giữ lại -? Tại sao nó sẽ làm bất cứ điều gì khác)
Tại sao bạn sẽ kê khai tài sản là copy
không có nguy cơ bị đột biến?
Sẽ không TrickThemURL chỉ ghi đè -Copy nếu nó muốn trở thành độc hại? – Darren
@ Darren Tôi đoán bạn đúng - một cách để an toàn là sử dụng '[NSURL urlWithString: urlArg.standardizedURL]' và sau đó xác thực kết quả. – dasblinkenlight
Dựa trên thảo luận này có vẻ như 'strong' là" an toàn ". Điều này mở ra một cơ hội cho một trò chơi mèo và chuột, nhưng điều đó có thể được chấp nhận cho đến khi tính hữu dụng của lớp này vượt ra ngoài giới hạn của một ứng dụng đơn lẻ. – edelaney05