Ваш код работает. Попробуйте это:
NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", @"b", @"b", @"d", nil];
NSLog(@"a: %@\ndistinctA: %@", a, [[NSSet setWithArray:a] allObjects]);
Вывод:
a: (
a,
b,
c,
d,
b,
b,
d
)
distinctA: (
c,
d,
a,
b
)
Зная, что код работает для массива, который содержит дубликаты объектов, теперь вам нужно задаться вопросом, почему объекты, которые вы считаете дубликатами, не считаются таковыми. Существующие ответы относительно хэша и isEqual указывают вам правильное направление.