У меня есть следующий метод:Объект освобожден с CFRelease вызывает очевидный крах, но только редко
+ (NSString*) getMD5HashFromFile:(NSString*)filePath {
CFStringRef md5hash = FileMD5HashCreateWithPath((CFStringRef)filePath, FileHashDefaultChunkSizeForReadingData);
NSString *hashStr = (NSString*)md5hash;
CFRelease(md5hash);
return hashStr;
}
я получал случайные сбои на тренажере, около 1 в 20-30 казней. Тот факт, что это было непротиворечиво, не помогало мне раньше копать.
Теперь, когда я снова вижу код, кажется, что md5hash
освобождается перед возвратом, что означает, что возвращаемый объект недействителен. Возвращаемое значение используется в другом методе последовательным образом, который иногда падает, но не всегда. Мой вопрос в том, почему это происходит редко и не всегда.
Означает ли это что-то общее с комбинацией кода Obj-C и C и как работают пулы autorelease?
Примечание: ошибка, по-видимому, исправлена с помощью NSString *hashStr = [NSString stringWithString:(NSString*)md5hash]
, что имеет для меня полный смысл.
Спасибо Роб. Я думаю, что это довольно хорошее объяснение. Собственно, теперь, когда я вижу, что это написано, я не понимаю, что я уже это сделал. Видимо, не очень хорошо :) Еще раз спасибо – dimitrios
Мы все забываем, что мы думаем, что мы должны были помнить: D https://twitter.com/#!/cocoaphony/status/174989186032603136 –