Jak przekonwertować (lub utworzyć) klasę pojedynczą, która kompiluje się i zachowuje poprawnie podczas korzystania z automatycznego liczenia odwołań (ARC) w Xcode 4.2?
objective-c
ios
singleton
automatic-ref-counting
cescofry
źródło
źródło
Odpowiedzi:
Dokładnie w taki sam sposób, w jaki (powinieneś) już to robić:
źródło
static
Zmienne zadeklarowane w metodzie / funkcji są takie same jakstatic
zmienna zadeklarowana poza metodą / funkcją, są po prostu poprawne tylko w zakresie tej metody / funkcji. Każde oddzielne wykonanie tej+sharedInstance
metody (nawet w różnych wątkach) „zobaczy” tę samąsharedInstance
zmienną.jeśli chcesz w razie potrzeby utworzyć inną instancję. zrób to:
w przeciwnym razie powinieneś to zrobić:
źródło
dispatch_once()
Bit oznacza, że nie otrzymasz dodatkowych instancji, nawet w pierwszym przykładzie ...?[[MyClass alloc] init]
i ominąćsharedInstance
dostęp. DongXu, powinieneś spojrzeć na artykuł Petera Hoseya w Singleton . Jeśli zamierzasz przesłonić,allocWithZone:
aby zapobiec tworzeniu większej liczby wystąpień, powinieneś również przesłonić,init
aby zapobiec ponownej inicjalizacji wystąpienia współużytkowanego.allocWithZone:
wersja. Dzięki.To jest wersja dla ARC i non-ARC
Jak używać:
MySingletonClass.h
MySingletonClass.m
źródło
To jest mój wzór pod ARC. Zgodny z nowym wzorcem przy użyciu GCD, a także ze starym wzorcem zapobiegania instancjom firmy Apple.
źródło
c1
bycia instancjąAAA
superklasy? Trzeba zadzwonić+alloc
naself
nie nasuper
.super
nie oznacza obiektu super-klasy. Nie możesz uzyskać obiektu super-klasy. Oznacza to po prostu kierowanie wiadomości do wersji metody super-klasy.super
nadal punktujeself
klasę. Jeśli chcesz uzyskać obiekt super-klasy, musisz uzyskać funkcje odbicia w czasie wykonywania.-allocWithZone:
Metoda @NickForge And jest po prostu prostym łańcuchem do funkcji alokacji środowiska wykonawczego, oferując punkt nadpisania. Ostatecznie więcself
pointer == bieżący obiekt klasy zostanie przekazany do alokatora, a na koniecAAA
zostanie przydzielona instancja.super
działa w metodach klasowych.Przeczytaj tę odpowiedź, a następnie przejdź i przeczytaj drugą odpowiedź.
Musisz najpierw wiedzieć, co oznacza Singleton i jakie są jego wymagania, jeśli go nie rozumiesz, to nie zrozumiesz rozwiązania - w ogóle!
Aby pomyślnie utworzyć singleton, musisz umieć wykonać następujące 3:
dispatch_once_t
pomaga rozwiązać stan wyścigu, zezwalając na jednorazowe wysłanie jego bloku.Static
pomaga „zapamiętać” jego wartość w dowolnej liczbie wywołań. Jak to zapamiętuje? Nie pozwala na ponowne utworzenie żadnej nowej instancji o tej dokładnej nazwie Twojej SharedInstance, po prostu działa z tą, która została pierwotnie utworzona.Nie używając wywoływania
alloc
init
(tj. Nadal mamyalloc
init
metody, ponieważ jesteśmy podklasą NSObject, chociaż NIE powinniśmy ich używać) w naszej klasie sharedInstance, osiągamy to przez użycie+(instancetype)sharedInstance
, które jest ograniczone do zainicjowania tylko raz , niezależnie od wielu prób z różnych wątków w tym samym czasie i pamiętaj o jego wartości.Niektóre z najpopularniejszych singletonów systemowych, które są dostarczane z samym kakao, to:
[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSFileManager defaultManager]
[NSBundle mainBundle]
[NSOperations mainQueue]
[NSNotificationCenter defaultCenter]
Zasadniczo wszystko, co musiałoby mieć scentralizowany efekt, musiałoby być zgodne z pewnym wzorcem projektowym typu Singleton.
źródło
Alternatywnie Objective-C zapewnia metodę inicjalizacji + (void) dla NSObject i wszystkich jego podklas. Jest zawsze wywoływana przed wszystkimi metodami klasy.
Ustawiłem punkt przerwania w jednym raz w iOS 6 i dispatch_once pojawił się w ramkach stosu.
źródło
Klasa pojedyncza: nikt nie może utworzyć więcej niż jednego obiektu klasy w żadnym przypadku ani w żaden sposób.
źródło
Z zaakceptowaną odpowiedzią wiążą się dwa problemy, które mogą, ale nie muszą być istotne dla Twojego celu.
Poniższy kod rozwiązuje oba te problemy:
źródło
Mam nadzieję, że powyższy kod pomoże.
źródło
jeśli potrzebujesz szybko stworzyć singletona,
lub
możesz użyć w ten sposób
źródło