"Rò rỉ tiềm ẩn của đối tượng được phân bổ trên dòng n và được lưu trữ trong 'biến số'."Cảnh báo phân tích tĩnh Xcode Clang này có thể bị chặn như thế nào?
Thông thường đây là cảnh báo phân tích rất hữu ích, nhưng có một vài trường hợp mà tôi nhận được các phản hồi giả gây phiền nhiễu mà tôi muốn ngăn chặn để giữ cho kết quả phân tích của tôi sạch sẽ. Trong sự bảo vệ của nhà phân tích, những gì nó nhận thấy chắc chắn sẽ là một rò rỉ bộ nhớ là nó không cho một bản phát hành trong một con đường thực hiện (mà nó bị mù).
Tôi sẽ giải thích thêm về tình huống của mình. Nó xảy ra ở nhiều hương vị khác nhau, nhưng mẫu chung như sau:
- Một đối tượng được phân bổ và đại biểu của nó được đặt.
- Một cái gì đó được thực hiện với đối tượng. (Một nhiệm vụ bắt đầu, một khung nhìn được hiển thị, vv).
- Thực hiện phương pháp hiện tại sẽ kết thúc. (Nhập cảnh báo Clang).
- Đối tượng quyết định nhiệm vụ của nó đã hoàn thành, gửi ủy quyền một tin nhắn.
- Đại biểu phát hành đối tượng.
Đây không phải là một mẫu thiết kế bí truyền, vì vậy tôi hy vọng có thể ngăn chặn được sự đàn áp. Tôi biết nó có thể tránh được bằng cách lưu trữ các đối tượng vi phạm trong một ivar sau đó được phát hành, nhưng tôi rất thích không thêm ô nhiễm ivar.
Nó đánh tôi là kỳ quặc khi đại biểu của đối tượng giữ lại nó. Thông thường, một đối tượng giữ lại nó là đại biểu, và để cho đại biểu giữ lại đối tượng sẽ tạo một chu trình giữ lại. Tôi không nói có trường hợp ZERO nơi một đại biểu có thể muốn giữ lại (có lẽ ngắn ngủi) đối tượng, nhưng nó có vẻ có liên quan để biết tại sao đó là trường hợp ở đây. Từ những gì được nói ở đây, tôi muốn nói rằng nó kosher nhiều hơn cho các đối tượng để giữ lại chính nó trong thời gian hoạt động và tin nhắn đại biểu tiếp theo hơn cho các đại biểu để "mất quyền sở hữu" phân bổ/init ngụ ý giữ lại. – ipmcc
@ipmcc: Mặc dù một đối tượng có thể giữ lại đại biểu của mình và có một vài nơi trong SDK nơi một lớp làm điều đó, tôi cho rằng lưu trữ đại biểu là yếu tố phổ biến hơn, để tránh giữ lại chu kỳ bạn đề cập. Dù bằng cách nào, nó chắc chắn không phải là "điển hình" cho một đối tượng để giữ lại đại biểu của nó. Trong trường hợp của tôi, một số lớp đã tạo một đối tượng có phân bổ/init và đặt chính nó làm đại biểu. Là chủ sở hữu của lớp, đại biểu sau đó phát hành đối tượng khi nó được thực hiện. Không có quyền sở hữu nào xảy ra ở đây. –
@ipmcc - Matt là đúng, mẫu bình thường là: Object A tạo đối tượng B và đặt chính nó làm đại biểu của đối tượng B. Đối tượng A giữ lại đối tượng B. Khi đối tượng A bị dealloced, nó chắc chắn để unset chính nó như là đại biểu của đối tượng B, nếu không bạn có thể sụp đổ. – DougW