Необходимо понимать управление памятью при использовании «unsigned char» для указания на буфер необработанных данных - PullRequest
1 голос
/ 11 февраля 2011

Мой вопрос в коде ниже.Я хотел бы понять, есть ли такая вещь, как «сохранение», когда дело доходит до указателей «unsigned char».Пожалуйста, объясните.

// MyObject.h

@interface myObject : NSObject {

    unsigned char   *myData;
}

// MyObject.m

-(void)makeNewData
{

    if (myData) { free(myData); }
    myData = [self createBitmapContextData:myCGImageRef];

    //Here is my question: do I need a "retain" call equivalent on the next line?
    //[myData retain];

}

- (unsigned char*)createBitmapContextData:(CGImageRef)fromImage
{

    CGContextRef cgctx = [self createARGBBitmapContextFromImage:myCGImage];
    if (cgctx == NULL) { return nil; }

    size_t w = CGImageGetWidth(myCGImage);
    size_t h = CGImageGetHeight(myCGImage);
    CGRect rect = {{0,0},{w,h}}; 

    CGContextDrawImage(cgctx, rect, myCGImage); 

    unsigned char* data = CGBitmapContextGetData (cgctx);

    CGContextRelease(cgctx);

    return data;

}

1 Ответ

0 голосов
/ 11 февраля 2011

Нет, нет такой вещи, как «сохранение» необработанного указателя.

Как говорит Макросс, NSData может использоваться для удержания данных, когда вы их выделяете сами.Однако в этом случае вам не принадлежат данные, вы просто «получаете» их от CGContext, которому они принадлежат.Ваша ссылка становится недействительной, когда CGContext выпущен.В этом случае вам нужно владеть ссылкой на контекст, пока вам больше не понадобится указатель.

...