10

Moje pytanie brzmi, dlaczego słabe IBOutletCollection jest zawsze zerowe? Jeśli zmiana jest słaba na silną, wszystkie moje przyciski są tam, to po prostu naprawdę dziwne. Próbuję zrozumieć logikę Apple i nie widzę różnicy między jednym przyciskiem a szeregiem przycisków w zakresie zarządzania pamięcią. Czy czegoś brakuje?słabe IBOutleCollection jest zawsze zerowe

+0

Dziękujemy za sformułowanie pytania jako problemu z "słabym". Natychmiast rozwiązałem mój problem! – phatmann

Odpowiedz

9

W żaden sposób kompletny, ale prosta odpowiedź:

Pojedyncza UIButton stworzony z IB jest automatycznie podrzędny jakiegoś innego UIView (przynajmniej .view Twojego UIViewController) i jest skierowany zdecydowanie do z tego powodu.

IBOutletCollection jest NSArray lub NSMutableArray, a nie UIView wyświetlane w dowolnym miejscu i UIViews oczywiście nie mają właściwość wskazuje na wylot (kolekcja) y tego punktu do nich, więc nic nie wskazuje na IBOutletcollections. Musisz to zrobić sam.

7

Od Apple Resource Programming Guide:

Każdorazowe zapytać klasę NSBundle lub NSNib załadować plik nib, kod bazowy tworzy nową kopię obiektów w tym pliku i zwraca je do Ciebie. (Kod ładowania nib nie przetwarza obiektów pliku Nib z poprzedniej próby ładowania.) Musisz zachować nowy wykres obiektów tak długo, jak to konieczne, i odrzucić go po zakończeniu. Zwykle potrzebujesz silnych odniesień do obiektów najwyższego poziomu, aby upewnić się, że nie są one zwolnione; nie potrzebujesz silnych odniesień do obiektów znajdujących się niżej na wykresie, ponieważ są one własnością ich rodziców i powinieneś zminimalizować ryzyko tworzenia silnych cykli odniesienia.

Z praktycznego punktu widzenia w gniazdach iOS i OS X należy zdefiniować zadeklarowane właściwości. Gniazda powinny być generalnie słabe, z wyjątkiem tych z Właściciela pliku do obiektów najwyższego poziomu w pliku nib (lub, w iOS, scenie storyboardu), które powinny być mocne. Utworzone gniazda powinny być zazwyczaj słabe, ponieważ:

Gniazda utworzone na potrzeby subskrybentów widoku kontrolera widoku lub okna kontrolera okien są na przykład arbitralnymi odniesieniami między obiektami, które nie implikują własności. Mocne wyjścia są często określane przez klasy szkieletowe (na przykład punkt widokowy UIViewController lub okno wyjściowe NSWindowController).

@property (weak) IBOutlet MyView *viewContainerSubview; 
@property (strong) IBOutlet MyOtherClass *topLevelObject; 

I dalej na stronie:

Wyloty należy zmienić na silne gdy wylot należy uznać właścicielem obiekt odwołanie:

  • Jak wskazano wcześniej, to często ma miejsce w przypadku obiektów znajdujących się na górnym poziomie obiektu w pliku nib, które są często uważane za własność właściciela pliku.
  • Użytkownik może w niektórych sytuacjach potrzebować obiektu z pliku końcówki poza istniejącym kontenerem. Na przykład możesz mieć gniazdko dla widoku, które może zostać tymczasowo usunięte z początkowej hierarchii widoku i dlatego musi być utrzymywane niezależnie.