Block_copy пропал без вести - PullRequest
0 голосов
/ 24 июня 2011

У меня есть проект Xcode, который включает OpenFeint в качестве зависимости. OpenFeint имеет один класс, который делает два вызова Block_copy() и один вызов Block_release(). Все было хорошо (как, например, я собирал и запускал проект несколько раз без происшествий), пока вдруг компилятор не начал жаловаться, что эти функции не существуют. Эта вещь буквально сломалась между двумя сборками, без каких-либо изменений в исходном коде.

Я понятия не имею, куда могли бы пойти эти функции, но я попытался обойти это, предоставив некоторые прототипы функций-заполнителей, например:

extern void* Block_copy(const void *aBlock);
extern void Block_release(const void *aBlock);

Я не уверен, что это правильные подписи (документация по этой теме в лучшем случае скудная), но это самая близкая мне возможность найти. К сожалению, это только заставляет компоновщика жаловаться вместо компилятора.

Так есть идеи? Вся моя среда разработки испорчена? Если нет, то как мне заставить его работать снова?

Ответы [ 3 ]

1 голос
/ 25 июня 2011

Фактическое определение Block_copy находится в /Developer/SDKs/MacOSX10.6.sdk/usr/include/Block.h и читает #define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__))) и _Block_copy определяется в том же файле BLOCK_EXPORT void * _Block_copy (const void * aBlock);

Предоставление собственного определения не поможет XCode. Изменилась ли ваша цель в XCode?

1 голос
/ 24 июня 2011

Вы переключили XCode или, возможно, iOS (намекает на что-то недавно выпущенное для разработчиков). Может случиться так, что, если вы случайно переключились на ARC, эти функции могут больше не существовать (ARC не находится под NDA, поскольку он уже существует и является открытым исходным кодом).

0 голосов
/ 27 июня 2011

Временное решение - встроить все содержимое «Block.h» в исходный файл OpenFeint. Странно, попытка #include или #import файла не работает, что может быть всей проблемой.

В любом случае этот файл должен существовать в /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator[VERSION].sdk/usr/include/Block.h, а его содержимое должно быть:

#ifndef _Block_H_
#define _Block_H_

#if !defined(BLOCK_EXPORT)
#   if defined(__cplusplus)
#       define BLOCK_EXPORT extern "C" 
#   else
#       define BLOCK_EXPORT extern
#   endif
#endif

#include <Availability.h>
#include <TargetConditionals.h>

#if __cplusplus
extern "C" {
#endif

    // Create a heap based copy of a Block or simply add a reference to an existing one.
    // This must be paired with Block_release to recover memory, even when running
    // under Objective-C Garbage Collection.
    BLOCK_EXPORT void *_Block_copy(const void *aBlock)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);

    // Lose the reference, and if heap based and last reference, recover the memory
    BLOCK_EXPORT void _Block_release(const void *aBlock)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);


    // Used by the compiler. Do not call this function yourself.
    BLOCK_EXPORT void _Block_object_assign(void *, const void *, const int)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);

    // Used by the compiler. Do not call this function yourself.
    BLOCK_EXPORT void _Block_object_dispose(const void *, const int)
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);

    // Used by the compiler. Do not use these variables yourself.
    BLOCK_EXPORT void * _NSConcreteGlobalBlock[32]
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
    BLOCK_EXPORT void * _NSConcreteStackBlock[32]
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);


#if __cplusplus
}
#endif

// Type correct macros

#define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__)))
#define Block_release(...) _Block_release((const void *)(__VA_ARGS__))


#endif
...