2017-01-24 9 views
5

w Swift, mamy normalne domyślne wpisującSwift. Czy (absolutnie) jedyna konkretna przewaga nieposiadanego przez słabe, wydajność?

  • obiektów po prostu nie może stać się zerowe.

mamy słaby wpisując

  • obiekt może stać się zerowe. jeśli obiekt staje się zerowa, kursor automatycznie staje się zerowa, więc wiesz, że obiekt stał nil

i mamy pozostawiony wpisując

  • obiekt może stać się zerowe. jeśli obiekt stanie się zerowy, nic się nie stanie z twoją wskazówką - jesteś skręcony, jeśli spróbujesz go użyć

(A więc: z następstwa: jedyny raz, kiedy możesz użyć "niezarejestrowany", to jeśli " absolutnie wiedzieć”obiekt nie będzie zerowa)

teraz.

wydaje mi się, że następujące zdanie,

jest absolutnie prawda ...

i absolutnie Znaczy, naprawdę, naprawdę, absolutnie, aż do najgłębszych ewentualnych problemów filozoficznych prawda ...

„Jedyna różnica między pozostawiony i słaby, jest wydajność. Ponieważ unowned nie ma kontroli, jest szybszy. Nie ma absolutnie żadnej innej różnicy „

i stąd logiczny wniosek:

.« Istnieje absolutnie, nie ma powodu, aby używać pozostawiony, inne niż jeśli potrzebna jest dodatkowa wydajność ponad słaby»

.

{bok - jedyna inna różnica mogę pomyśleć, to w samodokumentujące sensie Jeśli używam pozostawiony, to Kije do moich kolegów deweloperów do pewnych rzeczy, niech nam uchylenie tej kwestii na razie)

.

Moje pytanie jest proste oddział, bardzo dokładny, bardzo konkretny: są odważne zdania powyżej "prawdziwe" (w "całkowicie, bardzo, spektakularnie" prawdziwe poczucie prawdziwości).

+2

Czy nie ma dużej różnicy, że nie trzeba go odpakowywać za każdym razem? –

+0

Prawidłowe, niezarezerwowane zmienne nie są opcjonalne, więc można uniknąć tego problemu. – vacawama

+0

@JamesP - to może być wyjątkowy punkt; może może być odpowiedź z pouczającym przykładem? – Fattie

Odpowiedz

3

zgadzam się z Yannick. Twoje pogrubione stwierdzenia są nieprawidłowe. Niewłaściwe odniesienie musi być ważne przez cały okres jego istnienia. W programie -Ounchecked nieprzestrzeganie tego warunku jest niezdefiniowanym zachowaniem. Nie mam na myśli "to się psuje". Mam na myśli, że nie jest to dobrze uformowany program; nie jest zdefiniowane, co robi. Słaby punkt odniesienia nie może wygenerować niezdefiniowanego zachowania z powodu jego wydania, nawet pod numerem -Ounchecked.

Używanie unowned jest stwierdzeniem programisty, że referencja będzie ważna przez cały okres jej istnienia. To nawet nie jest coś, o czym mówi Type!. ! typy potwierdzają, że referencja będzie ważna w momencie, w którym jest dostępna. Dlatego nie można przetestować x == nil na niezatwierdzonym. To nie jest opcjonalne. To nie jest "opcjonalne w przebraniu" (np. Type!). To musi zawsze być ważne.

przeciwieństwie do słabej odniesienia Jednak pozostawiony odniesienia stosuje się, gdy drugi przykład ma taką samą trwałość lub dłuższy czas życia. ... Oczekuje się, że niezarealizowane odniesienie do ma wartość. - [The Swift Programming Language]

Więc do „możliwie najgłębszy filozoficzny”, pozostawiony zawiera warunek, który nie istnieje w słaby. Ten warunek wstępny istnieje poza programem i musi zostać udowodniony przez programistę, a nie przez kompilator, w celu zapewnienia dobrze sformułowanego programu.

Niezależnie od tego, czy istnieje powód, aby używać unowned, z pewnością jest, jeśli przyjmujemy absolutne stanowisko (jak w pytaniu). Jest to najcięższy typ w przypadkach, gdy warunek wstępny jest znany. weak jest słabszym typem niż unowned; wyraża mniej wstępnych warunków. Dobra teoria zachęca nas do używania najsilniejszych (najbardziej restrykcyjnych, najmniejszych dozwolonych wartości) typów, a unowned jest silniejszym typem niż weak.

W znaczeniu nie-absolutnym ("praktycznym"), wynikiem wyboru silniejszego typu jest prostszy kod. Gdy używasz weak, musisz stale potwierdzać warunek wstępny, że nie jest on nil za każdym razem, gdy go używasz i obsługiwać przypadki, w których się znajduje (prawdopodobnie wstawiając fatalError, które właśnie na nowo wymodelowuje unowned z większą ilością pracy). Korzystanie z unowned pozwala ci zachować ten warunek wstępny jeden raz. Tworzy to prostszy, bardziej poprawny kod. Nigdy nie użyłem prędkości unowned. Zawsze używałem go, aby uniknąć odpowiedzi w kółko "ale co, jeśli to nic nie znaczy?" w kodzie, gdzie nigdy nie może być zero.

+1

To głęboka myśl, że bez właściciela jest * silniejszy * ... miły. Niesamowite. – Fattie

+1

"Zawsze używałam go, aby uniknąć udzielania odpowiedzi w kółko", ale co, jeśli to nic nie ma? "W kodzie, gdzie nigdy nie może być zero". To bardzo wnikliwe i naprawdę odpowiada "sercu" pytania, jak sądzę. – Fattie

3

Pogrubione zdania to nieprawda..

Weak jest opcjonalna i można ją ustawić w dowolnym momencie.

Unowned jest nieobowiązkowe, ale może być zerowe. Jeśli tak się stanie i zadzwonisz, to Twoja aplikacja się zawiesza. Musi być ustawiony podczas inicjalizacji.

Kolejną różnicą jest wydajność, jak stwierdził autor. Unowned nie wykonuje żadnych testów i jest nieznacznie szybszy niż weak.

To lepiej pokazuje związek między klasami.

Możesz sprawdzić to tak pytanie o dalsze szczegóły: What is the difference between a weak reference and an unowned reference?

+0

'Unowned' jest nieobowiązkowy na powierzchni, ale może nagle stać się zerowym (lub nieprawidłowym wskaźnikiem, lepiej frazując) i zniszczyć twoją aplikację, jeśli jest używana niepoprawnie. – user28434

+0

To prawda, ale nie chciałem tu zagłębiać się w szczegóły. Zamieszczony link opisuje to znacznie bardziej szczegółowo, a autor sam to powiedział. – Yannick

+0

Hej @Yannick - dzięki za to; Jestem skłonny powiedzieć "ale czy są jakieś różnice poza tym" :), które być może nie są w duchu mojego pytania :) – Fattie