2013-09-23 78 views
6

Tôi có một số UICollectionViewController quản lý chế độ xem bộ sưu tập sử dụng bố cục khác nhau cho các trạng thái ứng dụng khác nhau. Tôi đang sử dụng -setCollectionViewLayout:animated: để chuyển đổi giữa các bố cục khác nhau. Tôi gặp phải lỗi truy cập không hợp lệ và sẽ vô cùng hữu ích khi biết những gì thực sự sở hữu (ví dụ: giữ tham chiếu strong) bố cục hiện tại của chế độ xem bộ sưu tập.Quyền sở hữu bố cục của UICollectionViewController (self.collectionView.collectionViewLayout so với self.collectionViewLayout)

Sau khi gọi -setCollectionViewLayout:animated:, tôi đã nhận thấy như sau (nơi selfUICollectionViewController):

  • self.collectionView.collectionViewLayout trả về cách bố trí mới.
  • self.collectionViewLayout vẫn trả lại bố cục cũ.

này dẫn tôi đến kiểm tra UICollectionView Class Reference, điều này giải thích hành vi này:

collectionViewLayout

Cách bố trí đối tượng sử dụng để khởi tạo bộ điều khiển xem bộ sưu tập. (Read-only)

@property (nonatomic,readonly) UICollectionViewLayout *collectionViewLayout

Thảo luận
Thuộc tính này chứa các đối tượng bố trí bạn truyền cho initWithCollectionViewLayout: phương pháp. Đối tượng bố trí trong thuộc tính này không được cập nhật để phản ánh các thay đổi đối với chế độ xem bộ sưu tập. Bạn có thể sử dụng thuộc tính này để tham chiếu đến đối tượng bố cục mà ban đầu bạn đã định cấu hình chế độ xem bộ sưu tập để sử dụng.

OK. Vì vậy, self.collectionViewLayout là một tham chiếu yếu (hoặc là nó?) Với bố cục ban đầu và self.collectionView.collectionViewLayout là tham chiếu mạnh mẽ đến bố cục hiện tại.

Để xác nhận điều này, tôi đã đi sâu vào trình gỡ lỗi, nhưng không thể tìm thấy số thực tế UICollectionView được cho là thuộc sở hữu của UICollectionViewController. Thay vào đó, biến số _view của bộ xem bộ sưu tập là một phiên bản của UICollectionViewControllerWrapperView. Whaaaat?

toàn bộ kinh nghiệm này để lại cho tôi với các câu hỏi sau:

  1. đâu là thực tế UICollectionView lưu trữ trong một UICollectionViewController?
  2. self.collectionViewLayout giữ tham chiếu strong đối với bố cục ban đầu không?

Trả lời

0

UICollectionView thực tế được lưu trữ trong UICollectionViewController ở đâu?

Đây thực sự không phải là doanh nghiệp của bạn. Ý tôi là, thật thú vị khi bạn tìm thấy một con trỏ đến khung nhìn bộ sưu tập, và bạn có thể tìm thấy con trỏ khác bằng cách tìm kiếm thông qua hệ thống phân cấp khung nhìn của bộ điều khiển. Điều quan trọng là bạn nên để UICollectionViewController lo lắng về chế độ xem bộ sưu tập. Tôi biết đó không phải là một câu trả lời thỏa mãn khi bạn đang cố gắng tìm ra lý do tại sao ứng dụng của bạn bị lỗi, nhưng ngoài việc gỡ lỗi, bạn nên tránh làm rối tung tầm nhìn của bộ điều khiển chế độ xem.

Self.collectionViewLayout có tham chiếu mạnh mẽ đến bố cục ban đầu không?

Đánh giá từ tài liệu, . Các thuộc tính Objective-C là strong by default và bạn có thể thấy từ đặc tả thuộc tính mà thuộc tính collectionViewLayout không chỉ định weak, vì vậy nó phải là strong.

Bằng chứng khác xuất phát từ tài liệu bạn trích dẫn, về cơ bản nói rằng thuộc tính cung cấp con trỏ đến bố cục mà bạn đã cung cấp lúc khởi tạo. Nó không nói rằng tài sản sẽ trả lại nil nếu bạn thay đổi bố cục - nó sẽ không thể nói rằng thuộc tính không được cập nhật và tiếp tục trỏ đến bố cục ban đầu ngay cả khi bạn thay đổi bố cục.

2

Alright, tôi đã trả lời câu hỏi đầu tiên của tôi: UICollectionViewControllerWrapperView có Ivar gọi _subviewCache, mà là một mảng có thể thay đổi chứa thực tế UICollectionView tại chỉ số 0. Weird.

Tuy nhiên, tôi vẫn yêu câu trả lời cho câu hỏi thứ hai của mình. Dường như với bộ điều khiển xem bộ sưu tập là không giữ nguyên tham chiếu ban đầu vì thuộc tính collectionViewLayout (bố cục ban đầu) là chỉ đọc và tôi không thể tìm thấy bất kỳ tham chiếu nào đến bố cục chế độ xem khi kiểm tra bộ sưu tập xem bộ điều khiển trong chế độ xem biến của trình gỡ rối. Tuy nhiên, nếu trường hợp này xảy ra, cách giữ vị trí ban đầu ngay cả sau khi tham chiếu mạnh mẽ của chế độ xem bộ sưu tập đến bố cục ban đầu đã được thay thế bằng tham chiếu mạnh mẽ đến bố cục khác?


Cập nhật: Nó chỉ ra các vụ tai nạn xấu truy cập tôi đã nhìn thấy đã thực sự gây ra bởi một vấn đề hơi khác nhau mà đã làm với UIDynamicAnimator 's quyền sở hữu của bố cục. Đây là gần như chắc chắn là một lỗi trong mã của Apple, và tôi đã đệ đơn radar mà bạn có thể đọc ở đây (trùng lặp chào đón!):

http://www.openradar.me/15062440

Điều đó nói rằng, không ai trong số này về mặt kỹ thuật đề cập đến câu hỏi thứ hai của tôi. Nó không còn liên quan đến tôi hay công việc của tôi nữa, nhưng tôi vẫn hoan nghênh và đưa ra bất kỳ câu trả lời thực sự nào, ngay cả khi họ hoàn toàn là học thuật vào thời điểm này.