2013-07-01 39 views
8

Có một vấn đề thú vị khi có một lớp được tham chiếu trong một bố cục XIB (phân lớp của UIScrollView) và không được phân bổ theo Công cụ/Phân bổ và không phá vỡ trong thói quen dealloc của nó. Hãy gọi nó là Sclass1.IOS 6.1 với ARC Class từ XIB không nhận được Deallocated, UIClassSwapper

Có một lớp đang sử dụng (gọi là Uclass) có tệp XIB và ổ cắm.

@property (nonatomic, weak) IBOutlet Sclass1* sclass1; 

Điều này được nối đúng với bố cục tệp XIB.

Sclass1 là thuộc tính được phân bổ khi XIB cho Uclass được tải. Uclass không nhận được deallocated và sau đó tái tạo theo thời gian và do đó chúng tôi có một trường hợp khác của Sclass1, nhưng Sclass1 không bao giờ biến mất và không thể tìm thấy một tham chiếu đến nó.

Đi sâu vào Công cụ hiển thị một Malloc và đó là nó.

FYI, lớp được bắt đầu với

[UIClassSwapper initWithCoder:] 

Trả lời

0

Tôi nghĩ bạn @property nên mạnh mẽ cho một lớp:

@property (nonatomic, strong) IBOutlet Sclass1* sclass1; 

strong là tương đương với retain và ARC sẽ quản lý việc phát hành cho bạn.

Bạn sẽ có thêm thông tin với Tài liệu của Apple về số Transitioning to ARC Release Notes trong phần trên thuộc tính thuộc tính.

+0

Đây là câu trả lời đúng, bất kỳ thứ gì là IBOutlet phải yếu, khung nhìn sẽ không được giải phóng vì bộ điều khiển có điểm giữ lại cho đầu ra và ổ cắm có tham chiếu tới bộ điều khiển. Tạo chu trình giữ lại. Có một upvote. –

5

Nếu một đối tượng không được phân phối theo ARC, điều đó có nghĩa là một tham chiếu mạnh mẽ đến nó tồn tại. Vì thuộc tính của bạn là weak, đối tượng phải được sở hữu mạnh mẽ bởi một thứ khác ngoài đối tượng Uclass (Nếu không nó sẽ bị xử lý ngay lập tức sau khi XIB đã tải). Trong đoạn code bạn đã cung cấp nó không phải là rõ ràng những gì chủ sở hữu mạnh thực tế của đối tượng này là, nhưng tôi cho rằng nó có thể là một (hoặc nhiều hơn) trong các cách sau:

  1. Kể từ khi lớp học của đối tượng là một UIView phân lớp, có thể (mạnh) được tham chiếu bởi số superview nếu được thêm là một trong số subviews. Điều này xảy ra tự động khi một tệp XIB được tải. Nếu số superview không được phân phối lại thì đối tượng SClass sẽ không được phân phối. Bạn có thể xóa quyền sở hữu này bằng cách gọi số removeFromSuperview
  2. Chu kỳ sở hữu mạnh (giữ chu kỳ) tồn tại ở đâu đó trong số các đối tượng SClass1 (tức là một trong các biến mẫu sở hữu mạnh có tham chiếu mạnh về chủ sở hữu - SClass1) . Cẩn thận rằng bất kỳ khối sử dụng self trực tiếp cũng giữ một tham chiếu mạnh mẽ. Có một tham chiếu mạnh mẽ đến khối sau đó thường dẫn đến một chu kỳ giữ lại. Lưu self vào một số __weak var và chuyển cho khối đó thay vì trừ khi bạn có lý do chính đáng.
  3. Tham chiếu mạnh được tạo theo cách thủ công tồn tại bằng ví dụ: thêm đối tượng vào một vùng chứa hoặc lưu con trỏ tới biến không phải là __weak.

Hãy thử tìm và xóa những chủ sở hữu mạnh mẽ này. Chỉ sau khi tất cả chúng được gỡ bỏ, đối tượng có thể được deallocated.

1

Vì tài sản của bạn yếu và vẫn không được phân phối, hãy tìm các tham chiếu mạnh mẽ đến Sclass hoặc chủ sở hữu của nó là Uclass. Có lẽ bạn đang sử dụng Uclass (hoặc Sclass) trong khối trực tiếp, mà không có __weak typeof (self) weakSelf nhảy múa và khối này tạo ra chu kỳ giữ lại. Đồng thời theo dõi quan hệ cha mẹ và con cái. Có thể có đại biểu là mạnh mẽ thay vì yếu hoặc hai bộ điều khiển giữ tài liệu tham khảo mạnh mẽ để eachother.

Ngoài ra, nếu bạn muốn có câu trả lời chi tiết hơn, vui lòng đăng thêm mã có liên quan.

+0

Cảm ơn bạn đã chỉ ra khối được giữ lại. Đó thực sự là một trường hợp phổ biến IMO. Thêm vào đó để trả lời của tôi là tốt. – burax

0

thời gian gần đây tôi đã có triệu chứng tương tự - Để giải quyết nó trong trường hợp của tôi, đối tượng của tôi đã đóng vai trò là đại biểu cho một số đối tượng khác, vì vậy phải thả đối tượng từ mọi trách nhiệm đại biểu của mình trước khi nó sẽ gọi dealloc