Khi biên dịch với ARC, các đối số phương pháp thường xuất hiện để được giữ lại ở đầu phương thức và được giải phóng ở cuối. Cặp giữ/giải phóng này dường như không cần thiết, và mâu thuẫn với ý tưởng rằng ARC "tạo ra mã mà bạn đã viết". Không ai trong những ngày tối, trước ARC này thực hiện thêm/giữ lại thêm trên tất cả các đối số phương pháp chỉ để được an toàn, đúng không?Tại sao ARC giữ lại các đối số phương thức?
xem xét:
@interface Test : NSObject
@end
@implementation Test
- (void)testARC:(NSString *)s
{
[s length]; // no extra retain/release here.
}
- (void)testARC2:(NSString *)s
{
// ARC inserts [s retain]
[s length];
[s length];
// ARC inserts [s release]
}
- (void)testARC3:(__unsafe_unretained NSString *)s
{
// no retain -- we used __unsafe_unretained
[s length];
[s length];
// no release -- we used __unsafe_unretained
}
@end
Khi biên soạn với Xcode 4.3.2 ở chế độ phát hành, lắp ráp (ví dụ mà tôi có thể hiểu được nó) chứa các cuộc gọi đến và objc_retain
objc_release
lúc bắt đầu và kết thúc của phương pháp thứ hai. Chuyện gì vậy?
Đây không phải là vấn đề lớn, nhưng lưu lượng bổ sung/giải phóng thêm này sẽ hiển thị khi sử dụng Công cụ để lập hồ sơ mã nhạy cảm với hiệu suất. Có vẻ như bạn có thể trang trí các đối số phương thức với __unsafe_unretained
để tránh việc giữ lại/giải phóng thêm, như tôi đã làm trong ví dụ thứ ba, nhưng làm như vậy cảm thấy khá kinh tởm.
Bất kỳ ý tưởng nào tại sao nó không xảy ra trong ví dụ đầu tiên? – Thilo
Bạn luôn có thể kiểm tra mã được tạo ra thực tế bằng cách sử dụng chế độ xem trợ lý tháo gỡ. – Danra