7

Có hợp lệ để sử dụng công cụ sửa đổi bộ nhớ __weak trong chữ ký của triển khai phương pháp không? Đặc biệt nếu nó không phải là một phần của chữ ký công khai của phương pháp? Ví dụ:Sử dụng __weak để sửa đổi lưu trữ thông số khi triển khai

- (UIView *)tableView:(__weak UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionIndex 
{ 
    UIView *view = [ABHeaderView view]; 
    view.actionBlock = ^{ 
     [tableView doSomething]; 
    } 
    // ... 
    return view; 
} 

Điều này có sử dụng đúng cách tableView làm con trỏ yếu không? Hoặc tôi có nên thực sự làm điều gì đó như __weak *weakTableView = tableView; và sử dụng weakTableView trong khối không?

Tôi không nhận được bất kỳ cảnh báo hoặc lỗi nào và Công cụ phân tích tĩnh điện tử không ném bất kỳ cảnh báo nào.

Trả lời

1

Không được tính vào bộ sửa đổi lưu trữ hoặc thuộc tính để được vinh danh 'động' khi có công văn động tham gia và ghi đè (1).

Phương thức này được khai báo chính thức trong UIKit. Trình biên dịch có thể làm cho nó sai khi sử dụng ARC vì nó có thể khớp với bộ chọn với khai báo ban đầu khi được gọi. Nghĩa là, khai báo của bạn không hiển thị với UIKit, và UIKit sẽ coi nó là mặc định/mạnh nếu nó được biên dịch như ARC. Điều này có thể xảy ra nếu các khai báo không khớp hoặc thậm chí nếu chúng không hiển thị trong bản dịch của trình khách + người gọi.

Loại thông số/thuộc tính không phải là một phần của bộ chọn cũng như không được áp dụng để gửi động. ARC nên giả định mạnh ở đây và rằng người gọi gọi giữ tham chiếu. Ví dụ cụ thể này có thể không gây ra lỗi thời gian chạy, nhưng đó là một thực tiễn có vấn đề mà tôi cho là có thể tìm thấy lỗi. Tôi đã chứng minh điều này cho các thuộc tính in this answer. Về cơ bản, nó là một khái niệm tương tự.

Quy tắc đơn giản với công văn objc động: Luôn khớp với chữ ký của khai báo ban đầu khi redeclaring, define và overriding. Ngoại lệ duy nhất mà người ta có thể thực hiện là cho các vòng loại tương thích C sẽ không làm thay đổi chữ ký (thực tế là un phổ biến trong các chương trình ObjC mà tôi đã thấy).

(1) về mặt kỹ thuật, nó không phải là ghi đè, nhưng thực hiện phương thức của giao thức. bất kể, sig phải giống hệt nhau.

0

__strong hoặc __weak công cụ sửa đổi bộ nhớ là một phần của việc triển khai nội bộ của bạn, theo như tôi thấy. Chúng không ảnh hưởng đến mã được tạo bởi người gọi phương thức, vì vậy tôi nghĩ rằng bạn đang an toàn và rất có thể trong tương lai.

Tôi nghĩ rằng đó là phong cách kém, do đó, đề xuất của bạn sao chép tham chiếu đến một tham chiếu yếu có vẻ là một giải pháp tốt.

Các vấn đề liên quan