Malloc для указателя CGPoint, выбрасывающего EXC_BAD_ACCESS при доступе - PullRequest
3 голосов
/ 17 июня 2010

Я пытаюсь использовать фрагмент кода из руководства по программированию Apple, и получаю EXC_BAD_ACCESS при попытке передать указатель на функцию сразу после выполнения malloc.

(Для справки: Руководство по программированию приложений iPhone: обработка событий - Перечисление 3-6 )

Код, о котором идет речь, действительно прост:

CFMutableDictionaryRef touchBeginPoints;
UITouch *touch;

....

CGPoint *point = (CGPoint *)CFDictionaryGetValue(touchBeginPoints, touch);

if (point == NULL)
{
    point = (CGPoint *)malloc(sizeof(CGPoint));
    CFDictionarySetValue(touchBeginPoints, touch, point);
}

Теперь, когда программа переходит к оператору if, она присваивает 'output' malloc в переменную / указатель point.

Затем, когда он пытается передать point в функцию CFDictionarySetValue, он завершает работу приложения с: Program received signal: “EXC_BAD_ACCESS”.

Кто-то предложил не делать malloc и передать point var / pointer как: &point, однако это все равно дало мне EXC_BAD_ACCESS.

Что я (и похоже на Apple) делаю неправильно ???

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 17 июня 2010

Ответ Шона в основном правильный.В соответствии с документацией для CFDictionarySetValue, он попытается установить retain значение в соответствии с настройкой CFMutableDictionaryRef.Я предполагаю, что когда вы создаете изменяемый словарь (предположительно, с использованием CFDictionaryCreateMutable()), вы не предоставляете пользовательские обратные вызовы для , как обрабатывать установку и удаление значений .

EDIT:

Другой вариант предоставления пользовательских обратных вызовов - предоставить NULL для значений обратных вызовов:

CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, NULL);

CGPoint * point = (CGPoint *)malloc(sizeof(CGPoint));
point->x = 42;
point->y = 42;

CFDictionarySetValue(dict, @"foo", point);


CGPoint * newPoint = CFDictionaryGetValue(dict, @"foo");
NSLog(@"%f, %f", newPoint->x, newPoint->y);

Журналы:

2010-06-17 11:32:47.942 EmptyFoundation[45294:a0f] 42.000000, 42.000000
2 голосов
/ 17 июня 2010

CGPoint - это структура, а не объект Objective-C / CF, поэтому вам нужно обернуть его в NSValue:

+ (NSValue *)valueWithPoint:(NSPoint)aPoint

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSValue_Class/Reference/Reference.html#//apple_ref/occ/clm/NSValue/valueWithPoint:

1 голос
/ 17 июня 2010

Вероятно, сбой, потому что он пытается сохранить CGPoint, когда вы помещаете его в словарь, за исключением того, что CGPoint не является реальным объектом, а вместо этого структурой C.

...