Одним из способов решения этой проблемы является использование NSMutableData, поэтому вы можете заменить
unsigned char *rawData = malloc(height * width * 4);
с
myData = [[NSMutableData alloc] initWithCapacity:height * width * 4];
unsigned char *rawData = myData.mutableBytes;
затем вы можете освободить myData в вашем деаллокаторе.
альтернативно вы можете сделать
myData = [NSMutableData dataWithCapacity:height * width * 4];
Это будет означать, что ваши myData будут храниться в течение всего цикла обработки событий, вы можете даже изменить тип возвращаемого значения getRawData метода для возврата NSMUtableData или NSData, и таким образом он может быть сохранен другими частями вашего кода, единственный раз, когда я возвращаю необработанные байты в моем коде, если я знаю, что он будет доступен для жизни объекта, который его возвращает, таким образом, если мне нужно удерживать Данные я могу сохранить класс владельца.
Apple будет часто использовать
myData = [[NSMutableData alloc] initWithCapacity:height * width * 4];
unsigned char *rawData = myData.mutableBytes;
, а затем задокументируйте, что если вам нужны байты за пределами текущего цикла пула автоматического выпуска, вам придется скопировать его.