我知道围绕Objective-C的方式,我有从.NET的垃圾收集经验,虽然我从来没有在objective-c中使用它。我在不使用它的情况下编写代码。
现在我想到使用其中一个仅作为GC提供的框架(Blocks)。我的问题是 - 我是否仍然可以使用框架而不更改我当前的非GC代码并且不使用GC本身?
答案 0 :(得分:3)
如garbage collection programming guide中所述,“编译为GC必需的代码被假定为不使用传统的Cocoa保留/释放方法,并且可能无法加载到未启用垃圾收集的应用程序中。”
不幸的是,没有。但是采用垃圾收集需要做多少工作取决于你的应用程序。您可以尝试测试它是否看起来像一个大项目。 (通常是,但有时它并不是那么糟糕。)
答案 1 :(得分:3)
流程是GC或非GC。也就是说,所有Objective-C要么总是GC,要么永远不会GC。在一个过程中没有混合两种存储器模型。您不能将仅GC框架与仅非GC的框架混合使用。
构建框架时,可以将GC设置为“受支持”,此时框架可以在GC'd或非GC进程中使用。但是,您必须单独维护两个运行环境的正确性。
您所参考的“块”框架是什么?如果您正在讨论Snow Leopard的Objective-C中提供的语言功能,那么它在GC和非GC下都能正常工作。
答案 2 :(得分:0)
在项目设置中,您可以使用GC支持(NOT required)进行编译,它们应该混合得很好。使用GC进行编译但不是必需的应该允许保留/释放与GC一起工作
如果您无法在支持GC的情况下编译项目,那么您将遇到麻烦。
编辑:澄清:如果您使用GC编译项目(仅限-fobjc-gc),您的保留/释放代码将被忽略。如果您在不考虑GC的情况下进行编译,则无法使用GC框架。但是,如果使用GC支持(-fobjc-gc)进行编译,则保留/释放代码将根据需要运行,GC框架也可以正常工作。
编辑:进一步澄清(我今天真的很累):如果你包含一个只有GC的框架,你必须用-fobjc-gc或-fobjc-gc-only编译并运行垃圾收集,其中你的保留/释放声明确实是无操作的。但是,如果使用-fobjc-gc-only进行编译并尝试包含不使用任何GC支持构建的框架,则会遇到问题。虽然我的理解是如果使用-fobjc-gc进行编译,但您可以包含仅GC框架以及非GC框架。从我上面链接的文档:编译为GC支持的代码是 推测也包含传统的 保留/释放方法逻辑,可以 加载到任何应用程序中。
因此,如果您希望您的框架能够与任何东西一起使用,那么您最好使用-fobjc-gc而不是-fobjc-gc进行编译。
显然我昨天很难想到键盘。根据文件:
-fobjc-gc-only这意味着只存在GC逻辑。代码编译为GC 推定不要使用 传统的可可保留/释放 方法,可能无法加载到 没有运行的应用程序 垃圾收集已启用。
因此,如果使用GC Required构建框架,则无法将其加载到不支持GC的应用程序中。
另据文档说明:
-fobjc-gc这意味着GC和保留/释放逻辑都存在。码 编译为GC支持是假定的 也包含传统 保留/释放方法逻辑,可以 加载到任何应用程序中。
因此,虽然开发人员负担在包含GC支持的项目中包含保留/释放逻辑,但这允许在任何应用程序中加载框架。
我为昨天不清楚的漫无语道歉。我睡了3个小时,试着一次做几件事。永远不是一个好主意。