Ios4 块拷贝丢失了

Ios4 块拷贝丢失了,ios4,compiler-construction,xcode4,objective-c-blocks,Ios4,Compiler Construction,Xcode4,Objective C Blocks,我有一个Xcode项目,其中包含OpenFeint作为依赖项。OpenFeint有一个类,它两次调用Block\u copy(),一次调用Block\u release()。一切都很好(比如,我构建并运行了很多次项目,都没有发生意外),直到编译器突然开始抱怨这些函数不存在。这件事实际上是在两个构建之间发生的,中间没有对源代码进行任何更改 我不知道这些函数会去哪里,但我尝试通过提供一些占位符函数原型来解决它,如: extern void* Block_copy(const void *aBlock

我有一个Xcode项目,其中包含OpenFeint作为依赖项。OpenFeint有一个类,它两次调用
Block\u copy()
,一次调用
Block\u release()
。一切都很好(比如,我构建并运行了很多次项目,都没有发生意外),直到编译器突然开始抱怨这些函数不存在。这件事实际上是在两个构建之间发生的,中间没有对源代码进行任何更改

我不知道这些函数会去哪里,但我尝试通过提供一些占位符函数原型来解决它,如:

extern void* Block_copy(const void *aBlock);
extern void Block_release(const void *aBlock);
我不确定这些签名是否正确(关于这个主题的文档充其量是稀疏的),但这是我能找到的最接近的签名。不幸的是,这只会导致链接器而不是编译器抱怨


有什么想法吗?我的整个开发环境都完蛋了吗?如果没有,我如何让它重新工作?

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

块拷贝的实际定义在 /Developer/SDKs/MacOSX10.6.sdk/usr/include/Block.h 读到
#定义块副本(…)(uuuu类型(uu VA_ARGS_uu))u块副本((const void*)(u VA_ARGS_uu)))
和_Block_copy在同一文件中定义为 块\导出无效*块\副本(常数无效*锁定)


提供自己的定义对Xcode没有帮助。您在XCode中的目标是否已更改?

临时解决方法是将“Block.h”的全部内容内联到OpenFeint源文件中。奇怪的是,试图
#包括
#导入
文件不起作用,这可能就是问题的全部原因

在任何情况下,此文件应存在于
/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
\ifndef\u块_
#定义块_
#如果!定义(块输出)
#如果已定义(uuu cplusplus)
#定义块_导出外部“C”
#否则
#定义块导出外部
#恩迪夫
#恩迪夫
#包括
#包括
#如果
外部“C”{
#恩迪夫
//创建块的基于堆的副本,或者简单地添加对现有块的引用。
//这必须与Block_release配合使用才能恢复内存,即使在运行时也是如此
//在Objective-C垃圾收集下。
块\导出无效*块\副本(常数无效*锁定)
__OSX可用启动(MAC 10 6、IPHONE 3 2);
//丢失引用,如果是基于堆的引用,则恢复内存
块\导出无效\块\释放(常数无效*锁定)
__OSX可用启动(MAC 10 6、IPHONE 3 2);
//由编译器使用。不要自己调用此函数。
块\导出无效\块\对象\赋值(无效*,常数无效*,常数整型)
__OSX可用启动(MAC 10 6、IPHONE 3 2);
//编译器使用。请勿自己调用此函数。
块\导出无效\块\对象\处置(常量无效*,常量整型)
__OSX可用启动(MAC 10 6、IPHONE 3 2);
//由编译器使用。不要自己使用这些变量。
块\导出无效*\ NSConcreteGlobalBlock[32]
__OSX可用启动(MAC 10 6、IPHONE 3 2);
块\u导出无效*\n块重新测试块[32]
__OSX可用启动(MAC 10 6、IPHONE 3 2);
#如果
}
#恩迪夫
//键入正确的宏
#定义块副本(…)(((uuuu类型(uuu VA_uargs))块副本((const void*)(uu VA_uargs)))
#定义块释放(…)\u块释放((const void*)(\uu VA\u ARGS)
#恩迪夫

没有,没有切换/升级任何内容。我使用的是iOS 4.3 SDK,它不包括ARC,对吗?我明白了。我犯了升级到开发者预览的错误,我的代码以几乎相同的方式中断(因此我的答案)…不,我所有的XCode设置似乎都很好。如果我注释掉了有问题的行,那么应用程序的构建和运行就不会出现问题。不过,我担心这样做可能会破坏OpenFeint的某些功能。