không phải tất cả getters lấy mẫu đơn này:
- (id)variable { return variable; }
... mà chỉ đơn thuần là hình thức nguyên thủy nhất. riêng các thuộc tính nên đề xuất nhiều kết hợp hơn, thay đổi việc thực hiện. trình truy cập nguyên thủy ở trên không tính đến các thành ngữ được sử dụng kết hợp với quản lý bộ nhớ, nguyên tử hoặc sao chép ngữ nghĩa. việc triển khai cũng mong manh trong ghi đè lớp con.
một số ví dụ thực sự ngắn gọn theo sau; mọi thứ rõ ràng trở nên phức tạp hơn trong các chương trình thực sự nơi triển khai trở nên phức tạp hơn nhiều.
1) getter có thể không trả lại biến mẫu.một trong nhiều khả năng:
- (NSObject *)a { return [[a copy] autorelease]; }
2) setter có thể không giữ lại biến mẫu. một trong những khả năng:
- (void)setA:(NSObject *)arg
{
...
a = [arg copy];
...
}
3) bạn kết thúc với việc thực hiện quản lý bộ nhớ trong suốt chương trình của bạn, mà làm cho nó khó khăn để duy trì. ngữ nghĩa của lớp (và làm thế nào nó xử lý đếm ref dụ biến) nên được giữ ở lớp, và làm theo ước cho kết quả mong đợi:
- (void)stuff:(NSString *)arg
{
const bool TheRightWay = false;
if (TheRightWay) {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[string release];
// - or -
NSMutableString * string = [[arg mutableCopy] autorelase];
[string appendString:@"2"];
self.a = string;
}
else {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[self.a release];
}
}
thất bại trong việc làm theo các quy tắc đơn giản làm cho mã của bạn khó có thể duy trì và gỡ lỗi và đau đớn để mở rộng.
vì vậy, ngắn gọn là bạn muốn làm cho chương trình của mình dễ bảo trì. gọi phát hành trực tiếp trên một tài sản đòi hỏi bạn phải biết rất nhiều bối cảnh của các hoạt động bên trong của lớp; đó rõ ràng là xấu và bỏ lỡ những lý tưởng mạnh mẽ của OOD tốt.
nó cũng hy vọng các tác giả/lớp con/khách hàng biết chính xác lớp bị lệch khỏi quy ước như thế nào, thật ngớ ngẩn và mất thời gian khi phát sinh sự cố và bạn phải học lại tất cả các chi tiết bên trong khi có vấn đề.).
đó là một số ví dụ nhỏ về cách phát hành cuộc gọi trên kết quả của thuộc tính giới thiệu sự cố. nhiều vấn đề trong thế giới thực có nhiều khó khăn và khó xác định.
Đó là một đề xuất rất nguy hiểm; getter sẽ không luôn luôn như thế. Trong thực tế, nếu đó là một tài sản 'nguyên tử' nó sẽ -cho phép/-autorelease. – bbum