Block_copy失踪了

时间:2011-06-24 08:01:59

标签: ios4 compiler-construction xcode4 objective-c-blocks

我有一个Xcode项目,其中包含OpenFeint作为依赖项。 OpenFeint有一个类,可以对Block_copy()进行两次调用,对Block_release()进行一次调用。一切都很顺利(因为我在没有发生事故的情况下多次构建和运行项目)直到编译器开始抱怨这些函数不存在。事情在两个版本之间完全打破了,两者之间没有对源代码进行任何更改。

我不知道这些功能可能在哪里,但我试图通过提供一些占位符函数原型来解决它,如下所示:

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

我不确定这些是否是正确的签名(关于这个主题的文档最多是稀疏的),但它是我能找到的最接近的。遗憾的是,这只会导致链接器抱怨而不是编译器。

那么任何想法?我整个开发环境搞砸了吗?如果没有,我该如何让它再次运作?

3 个答案:

答案 0 :(得分:1)

您是否切换过XCode或iOS(暗示最近为开发人员发布的内容)。可能是,如果您意外切换到ARC,这些功能可能不再存在(ARC不在NDA下,因为它已经存在且是开源的。)

答案 1 :(得分:1)

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中的目标是否已更改?

答案 2 :(得分:0)

临时解决方法是在OpenFeint源文件中内联“Block.h”的全部内容。奇怪的是,尝试#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