Block_copy 丢失了

问题描述 投票:0回答:3

我有一个 Xcode 项目,其中包含 OpenFeint 作为依赖项。 OpenFeint 有一个类对

Block_copy()
进行两次调用,对
Block_release()
进行一次调用。 一切都很好(例如,我多次构建并运行该项目,没有发生任何事件),直到编译器突然开始抱怨这些函数不存在。 这个东西实际上是在两个构建之间中断的,中间没有对源代码进行任何更改。

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

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

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

有什么想法吗? 我的整个开发环境都搞砸了吗? 如果没有,我该如何让它再次工作?

ios4 xcode4 objective-c-blocks openfeint
3个回答
1
投票

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


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 中的目标改变了吗?


0
投票

临时解决方法是将“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
© www.soinside.com 2019 - 2024. All rights reserved.