2012-04-23 3 views
2

Я делаю NSURL и передаю его селектору, который затем передает его другому селектору и т. Д. К тому времени, когда он добирается до него, он записывается в порядке, но дает сигаборт, когда он используется , Я подозреваю, что это означает, что мой объект был выпущен ARC. Как я могу убедиться, что он остается достаточно длинным, чтобы привыкнуть?ios ARC force retain NSURL

__strong NSURL *url = [[NSURL alloc] initWithString:str]; 

... passes to a selector 
... passes to another 
... and then to fetchVideoContent 

- (void)fetchVideoContent:(NSURL *)url withGUID:(NSString *)guid; 
{ 
    NSMutableURLRequest *req; 
    req = [NSMutableURLRequest requestWithURL:url // <-- DIES ON THIS LINE (SIGABRT) 
            cachePolicy:NSURLRequestUseProtocolCachePolicy 
           timeoutInterval:30.0]; 
    ... 

Это самая сильная вещь, о которой я мог думать, и которая все еще не работает. Любой совет?

ответ

5

Необходимо, чтобы начальная переменная url (__strong NSURL * url) продолжает существовать, когда объект url заканчивается в методе fetchVideoContent, если нет, вы получите ошибку, которую вы описываете. Мне кажется, что вы создаете объект url в методе, используя локальную переменную, а затем передаете этот объект несколькими способами, которые либо пересекаются с новым потоком, либо идут в конец runloop и обратно в следующий прогон.

Например, если с помощью шагов, которые вы пропустили, завершается текущий цикл выполнения, а исходная переменная url выходит за пределы области действия, объект url будет освобожден, поскольку на самом деле ничего больше не удерживает на нем. Передача объекта другому методу недостаточно, чтобы сохранить его, так как для параметра не будет вызываться сохранение.

Короткая версия: убедитесь, что что-то держится на url, вы можете сделать это свойством своего класса, переменной экземпляра или даже статикой, если вы будете использовать только один экземпляр вашего класса за раз.

+0

Этот отклик был основным фактором экономии времени. Благодаря! – GnarlyDog

2

Во-первых, вы должны убедиться, что на самом деле имеете дело с проблемой подсчета ссылок - запустить с включенными зомби.

Я понятия не имею, как проходит весь URL-адрес, но есть угловые случаи, когда необходим явный подсчет ссылок, когда включен ARC.

Если требуется семантика MRC, вы можете использовать CFRetain и сопоставлять это с CFRelease, или вы можете создавать свои собственные функции, которые не скомпилированы с включенным ARC.

Конечно, вы могли бы просто использовать CFTypes вместо этого (в данном случае).

+0

do «CF» необходимо вручную сохранить/отпустить? – Jacksonkr

+1

@Jackson они делают – justin

+0

только что закончили читать документы. Спасибо за информацию. Я до сих пор не знал о CFTypes. – Jacksonkr