Khi nào tôi nên thêm @synthesize
rõ ràng vào mã của mình?
Nói chung, nếu nó được yêu cầu: Bạn có thể sẽ không bao giờ gặp trường hợp cần thiết.
Tuy nhiên, có một trường hợp bạn có thể thấy nó hữu ích.
Giả sử bạn đang viết cả getter và setter tùy chỉnh, nhưng muốn một biến thể hiện để hỗ trợ nó. (Đối với thuộc tính nguyên tử, điều này đơn giản như muốn có một bộ định tuyến tùy chỉnh: trình biên dịch sẽ viết một bộ định tuyến nếu bạn chỉ định một bộ định vị cho một thuộc tính monatomic, nhưng không phải một thuộc tính nguyên tử.)
Xem xét điều này:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Điều này sẽ không hoạt động, bởi vì _title
không tồn tại. Bạn đã chỉ định cả getter hoặc setter, vì vậy Xcode (chính xác) không tạo biến phiên bản hỗ trợ cho nó.
Bạn có hai lựa chọn để làm cho nó tồn tại. Bạn có thể thay đổi @implementation
thành này:
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Hoặc thay đổi nó thành thế này:
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Nói cách khác, mặc dù tổng hợp dành cho các mục đích thực tế không bao giờ cần thiết *, nó có thể được sử dụng để xác định các biến phiên bản hỗ trợ thuộc tính khi bạn cung cấp getter / setter. Bạn có thể quyết định biểu mẫu nào ở đây bạn muốn sử dụng.
Trước đây, tôi đã ưu tiên chỉ định biến cá thể trong @implementation {}
, nhưng bây giờ tôi nghĩ rằng @synthesize
tuyến đường là lựa chọn tốt hơn vì nó loại bỏ kiểu thừa và liên kết rõ ràng biến sao lưu với thuộc tính:
- Thay đổi kiểu của thuộc tính và kiểu của biến thể hiện thay đổi.
- Thay đổi định tính lưu trữ của nó (ví dụ: làm cho nó yếu thay vì mạnh hoặc mạnh thay vì yếu) và định tính lưu trữ thay đổi.
- Xóa hoặc đổi tên thuộc tính và
@synthesize
sẽ tạo ra lỗi trình biên dịch. Bạn sẽ không kết thúc với các biến cá thể lạc chỗ.
* -Tôi biết một trường hợp cần thiết, liên quan đến việc phân chia chức năng giữa các danh mục trong nhiều tệp. Và tôi sẽ không ngạc nhiên nếu Apple sửa lỗi này, hoặc thậm chí đã có.