Odpowiedzi:
Gdy kolejność elementów w kolekcji nie jest ważna, zestawy zapewniają lepszą wydajność wyszukiwania elementów w kolekcji.
Powodem jest to, że zestaw używa wartości skrótu do wyszukiwania elementów (takich jak słownik), podczas gdy tablica musi iterować po całej zawartości, aby znaleźć określony obiekt.
Obraz z Dokumentacji Apple opisuje to bardzo dobrze:

Arrayto uporządkowana (kolejność jest zachowywana podczas dodawania) sekwencji elementów
[array addObject:@1];
[array addObject:@2];
[array addObject:@3];
[array addObject:@4];
[array addObject:@6];
[array addObject:@4];
[array addObject:@1];
[array addObject:@2];
[1, 2, 3, 4, 6, 4, 1, 2]
Setjest odrębną (bez duplikatów), nieuporządkowaną listą elementów
[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
[set addObject:@6];
[set addObject:@4];
[set addObject:@1];
[set addObject:@2];
[1, 2, 6, 4, 3]
Najlepszą odpowiedzią na to jest własna dokumentacja Apple .

Główna różnica polega na tym, że NSArraydotyczy kolekcji zamówionej i NSSetnieuporządkowanej.
Istnieje kilka artykułów, które mówią o różnicy w prędkości między nimi, jak ten . Jeśli przeglądasz nieuporządkowaną kolekcję, NSSetto świetnie. Jednak w wielu przypadkach musisz robić rzeczy, które tylko on NSArraymoże zrobić, więc poświęcasz prędkość dla tych umiejętności.
NSSet
NSArray
Tak naprawdę to wszystko! Jeśli to pomoże, to daj mi znać.
NSSetna rzecz indeksowania. Często używa się dwóch różnych struktur danych dla tych samych danych. Albo budujesz i indeksujesz na tej tablicy :) Ale wtedy lepiej jest użyć bazy danych, która ma już zaimplementowaną.
NSSeti NSArray, moja odpowiedź jest dokładna i kompletna. Tak, możesz budować inne struktury danych, ale ja tylko porównuję te dwie.
NSArrayi jakiejś funkcjonalności z NSSet, poprawną odpowiedzią nie jest „używaj NSArrayi poświęć wydajność”. Odpowiedź brzmi: połącz oba lub użyj innej struktury danych.
Tablica służy do uzyskiwania dostępu do elementów według ich indeksu. Dowolny element można wstawić do tablicy wielokrotnie. Tablice zachowują kolejność swoich elementów.
Zestaw jest używany w zasadzie tylko do sprawdzenia, czy przedmiot jest w kolekcji, czy nie. Pozycje nie mają pojęcia kolejności ani indeksowania. Nie możesz mieć elementu w zestawie dwukrotnie.
Jeśli tablica chce sprawdzić, czy zawiera element, musi sprawdzić wszystkie jej elementy. Zestawy są zaprojektowane do korzystania z szybszych algorytmów.
Możesz sobie wyobrazić zbiór jak słownik bez wartości.
Zauważ, że tablica i zbiór nie są jedynymi strukturami danych. Istnieją inne, np. Queue, Stack, Heap, Fibonacci's Heap. Poleciłbym przeczytać książkę o algorytmach i strukturach danych.
Więcej informacji można znaleźć w Wikipedii .
containsoperacji to O(n). Liczba porównań, gdy nie ma w tablicy, wynosi n. Średnia liczba porównań, gdy obiekt znajduje się w tablicy, wynosi n/2. Nawet jeśli obiekt zostanie znaleziony, wydajność jest okropna.
NSArrays mają inne zalety szybkości w stosunku do NSSets. Jak zawsze, to kompromis.
NSArray *Arr;
NSSet *Nset;
Arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil];
Nset=[NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil];
NSLog(@"%@",Arr);
NSLog(@"%@",Nset);
tablica
04.12.2015 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)
zestaw
04.12.2015 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
Główne różnice zostały już podane w innych odpowiedziach.
Chciałbym tylko zauważyć, że ze względu na sposób implementacji zestawów i słowników (tj. Za pomocą skrótów), należy uważać, aby nie używać obiektów mutowalnych dla kluczy.
Jeśli klucz jest zmutowany, to hash (prawdopodobnie) również się zmieni, wskazując na inny indeks / zasobnik w tablicy hash. Oryginalna wartość nie zostanie usunięta i będzie faktycznie brana pod uwagę przy wyliczaniu lub pytaniu struktury o jej rozmiar / liczbę.
Może to prowadzić do naprawdę trudnych do zlokalizowania błędów.
Tutaj można znaleźć dość dokładne porównanie struktur NSArrayi NSSetdanych.
Krótkie wnioski:
Tak, NSArray jest szybszy niż NSSet pod względem prostego trzymania i iteracji. Zaledwie 50% szybciej przy konstruowaniu i aż o 500% szybciej przy iteracji. Lekcja: jeśli potrzebujesz tylko iterować zawartość, nie używaj NSSet.
Oczywiście, jeśli chcesz przeprowadzić testy pod kątem włączenia, ciężko pracuj, aby uniknąć NSArray. Nawet jeśli potrzebujesz zarówno iteracji, jak i testów włączenia, prawdopodobnie nadal powinieneś wybrać zestaw NSSet. Jeśli chcesz zachować porządek w swojej kolekcji i przetestować ją pod kątem włączenia, powinieneś rozważyć przechowywanie dwóch kolekcji (NSArray i NSSet), z których każda zawiera te same obiekty.
NSDictionary jest wolniejszy w tworzeniu niż NSMapTable - ponieważ musi skopiować kluczowe dane. Nadrabia to szybszym wyszukiwaniem. Oczywiście te dwie osoby mają różne możliwości, więc w większości przypadków to ustalenie powinno opierać się na innych czynnikach.
Zwykle używasz zestawu, gdy szybkość dostępu jest najważniejsza, a kolejność nie ma znaczenia lub jest określana w inny sposób (za pomocą predykatu lub deskryptora sortowania). Na przykład dane podstawowe używają zestawów, gdy dostęp do obiektów zarządzanych uzyskuje się za pośrednictwem relacji to-many
Żeby dodać trochę tego, używam czasami seta tylko po to, aby usunąć duplikaty z tablicy, takie jak: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values