Я не видел ваш исходный код, но ответы на большинство проблем ARC можно решить, если вы думаете с точки зрения владения, чем сохранять / выпускать / автоматически выпускать пулы.Попробуйте ответить, кому принадлежит массив, а кому - распакованные указатели.Если я правильно вас понимаю, ваш вызывающий метод выглядит примерно так:
NSArray *arr = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];
NSString *a, *b, *c, *d;
[arr unpackInto:&a, &b, &c, &d, nil];
Освобожден ли ваш массив перед доступом к распакованным переменным?Помните, что __autoreleasing не «сохраняет» значения в ваших переменных-указателях аргументов.Так что, если ваш массив освобожден, ваши указатели становятся мусором.Полагаю, ваш EXC_BAD_ACCESS заключается в том, что ваш основной массив освобождается.
__ strong не следует использовать при возврате по ссылке.Это не увеличит количество сохраняемых данных.Нет никакого способа сообщить ARC, что эти переменные должны быть освобождены в вызывающем методе.Таким образом, ARC выпускает их после своего объема.Единственный способ передать выделенный объект вызывающему методу и разрешить освобождение вызывающего метода - это вернуть его из метода, принадлежащего семейству init.Когда вы возвращаете значения через границы метода, ARC использует семейство методов (или макросы NS_RETURNS_RETAINED / NS_RETURNS_NON-RETAINED), чтобы определить, кто «владеет» указателем.
Вы можете использовать __strong для передачи по ссылке, если передаете constуказатель (указатели без обратной записи) На самом деле, для указателей на константы без квалификаторов владения подразумевается __strong.
Подробнее об этом в документации LLVM здесь http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.restrictions.pass_by_writeback