Привести const void * к const char *

У меня есть такой код:

NSData *data = [NSData dataWithContentsOfURL:objURL];
const void *buffer = [data bytes];
[self _loadData:buffer];
[data release];

функция "_loadData" принимает такой аргумент, как:

- (void)_loadData:(const char *)data;

Как преобразовать «const void » в «const char» на Objective-C?


person Nick VanderPyle    schedule 19.04.2009    source источник
comment
[выпуск данных]; линия не нужна. В средах без сбора мусора ваше приложение, скорее всего, выйдет из строя, и это покажет, что вы не полностью понимаете управление памятью Cocoa. Вы освобождаете только в том случае, если вы явно вызвали alloc, copy или mutableCopy (возможно, другие, о которых я сейчас не могу думать). Объект, возвращаемый из [NSData dataWithContentsOfURL:], автоматически освобождается или удаляется сборщиком мусора.   -  person dreamlax    schedule 19.04.2009
comment
Даже на айфоне где нет сборки мусора?   -  person Nick VanderPyle    schedule 19.04.2009
comment
В среде без сбора мусора объект добавляется в пул автоосвобождения и, скорее всего, будет освобожден в следующем цикле событий или при освобождении самого пула. В любом случае, вы не являетесь владельцем возвращенного объекта, поэтому вы не можете его выпускать, если вы понимаете, о чем я. Вы владеете только объектами, которые вы явно выделяете с помощью +alloc, -copy или -mutableCopy (и, возможно, других).   -  person dreamlax    schedule 19.04.2009
comment
Ах. Я понимаю. Спасибо. :) Мне нужно еще кое-что прочитать по этому вопросу, но ваше объяснение определенно помогло. По сути, не беспокойтесь об освобождении объекта, если только я не выделил или не скопировал его явно.   -  person Nick VanderPyle    schedule 19.04.2009


Ответы (2)


Как и в C:

[self _loadData:(const char *)buffer];

должно сработать.

person duncanwilcox    schedule 19.04.2009
comment
Спасибо! Я пытался назначить буфер другому типу, думая, что это просто указатели, это должно работать. const char *charBuff = буфер; Никогда не думал бросить это. Ха! - person Nick VanderPyle; 19.04.2009
comment
На самом деле это тоже сработало бы, если бы не const char *charBuff = (const char *)buffer; (назначая переменную char *, вам все еще нужно приведение) - person duncanwilcox; 20.04.2009

Вы не должны освобождать объект данных, потому что вы не выделили его явно. Кроме того, вы можете сделать простой бросок:

[self _loadData:(const char *) buffer];
person dreamlax    schedule 19.04.2009
comment
Хороший улов на NSData. Мне нужно больше узнать об управлении памятью. Спасибо! - person Nick VanderPyle; 19.04.2009