Tôi đoán là phiên bản trình biên dịch bạn đang sử dụng tuân theo các quy tắc quản lý bộ nhớ cho các thuộc tính được khai báo - cụ thể hơn, đối với các trình truy cập thuộc tính được khai báo:
Bạn có quyền sở hữu một đối tượng nếu bạn tạo nó bằng một phương thức có tên bắt đầu bằng cách phân bổ, phân phối mới, một bản sao, hay sao chép, hoặc mutableCopy.
Một thuộc tính có tên newTitle
, khi được tổng hợp, mang lại một phương thức được gọi -newTitle
, do đó cảnh báo / lỗi. -newTitle
được coi là một phương thức getter cho thuộc newTitle
tính, tuy nhiên các quy ước đặt tên cho biết một phương thức có tên bắt đầu bằng new
trả về một đối tượng thuộc sở hữu của người gọi, không phải là trường hợp của các phương thức getter.
Bạn có thể giải quyết điều này bằng cách:
Đổi tên tài sản đó:
@property (strong, nonatomic) NSString *theNewTitle;
Giữ tên thuộc tính và chỉ định tên getter không bắt đầu bằng một trong các tiền tố tên phương thức đặc biệt:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Giữ cả tên thuộc tính và tên getter và nói với trình biên dịch rằng, mặc dù tên getter bắt đầu bằng new
, nó thuộc về họ none
phương thức chứ không phải là họ new
phương thức:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
Lưu ý rằng mặc dù giải pháp này cho phép bạn giữ newTitle
cả tên thuộc tính và tên getter, nhưng có một phương thức được gọi là -newTitle
không trả về một đối tượng thuộc sở hữu của người gọi có thể gây nhầm lẫn cho người khác đọc mã của bạn.
Đối với hồ sơ, Apple đã xuất bản Chuyển đổi sang Ghi chú phát hành ARC , trong đó họ nêu:
Bạn không thể đặt tên một thuộc tính bắt đầu bằng new
hoặc copy
.
Họ đã được thông báo rằng tuyên bố của họ không hoàn toàn chính xác: thủ phạm là tên phương thức getter, không phải tên thuộc tính.
Chỉnh sửa 17 tháng 1 năm 2015: Tôi vừa nhận thấy một cam kết gần đây với Clang gợi ý tùy chọn 3 ở trên (sử dụng objc_method_family(none)
), bao gồm cả sửa lỗi, trong trường hợp chung trong đó tên thuộc tính khớp với một trong các tiền tố gia đình phương thức đặc biệt. Xcode có thể sẽ kết hợp thay đổi này cuối cùng.