У вас нет гарантий относительно срока службы буфера, на который указывал const char *data
, к тому моменту, когда выполняется асинхронный блок. data
может обмануть указатель этой точкой (и ее следует считать таким). Очень опасно использовать указатели стиля С в любых асинхронных ссылках или вне контекста, который они изначально были созданы.
Вы должны либо использовать управляемые объекты памяти (например, NSData
, NSString
и т.д.), или, если вы настаиваете на использовании указателей C-стиля и нужно ссылаться на этот указатель в асинхронном блоке, копировать данные в свой собственный буфер, используйте этот буфер, а затем освободите его, когда вы закончите использовать этот буфер в своей асинхронной процедуре. В этом случае у вас есть sData
, так что просто не обращайтесь к data
после этого момента, и все будет в порядке.
P.S. Позднее вы спросите, следует ли вам использовать @autoreleasepool
в этой ситуации.
Короче говоря, в большинстве случаев дополнительный пул авторефератов не требуется. Примечательно, что при использовании Grand Central Dispatch (например, dispatch_async
) у него есть собственные пулы автоопределений, поэтому вам не нужно их создавать. И когда ваш основной поток вернется к циклу запуска, опять же, это пул сливается. Короче говоря, вам нужны только созданные вручную пулы автозапуска при создании собственных объектов NSThread
.
Сказав это, иногда вы вводите пулы автоопределений, если выполняете значительные операции с интенсивной памятью, прежде чем возвращаться к циклу запуска. В этом случае вы добавите пулы автозавершения, чтобы уменьшить пиковое использование памяти приложения. Но это не было бы одним из таких случаев.
Это не C++. – Barmar
Objective-C смешанный с C++ – BugaBuga