Ios 过渡到ARC-释放未引发错误

Ios 过渡到ARC-释放未引发错误,ios,xcode,memory-management,automatic-ref-counting,Ios,Xcode,Memory Management,Automatic Ref Counting,我正在尝试将现有的非ARC项目移动到ARC。我已将“生成设置”中的Objective-C自动引用计数标志设置为“是” 当然,这在发送显式释放/自动释放消息时产生了很多错误。 对于代码中的错误,我删除了显式发布消息、dealloc块等。 对于在第三方库(如ASIHTTPRequest)中生成的错误,我在Build Phases-Compile Sources部分为所需文件添加了-fno objc arc标志 但是,在我修复了所有错误(并且项目成功编译)之后,我的代码中仍然有发布语句 例如,在应用程

我正在尝试将现有的非ARC项目移动到ARC。我已将“生成设置”中的Objective-C自动引用计数标志设置为“是”

当然,这在发送显式释放/自动释放消息时产生了很多错误。 对于代码中的错误,我删除了显式发布消息、dealloc块等。 对于在第三方库(如ASIHTTPRequest)中生成的错误,我在Build Phases-Compile Sources部分为所需文件添加了-fno objc arc标志

但是,在我修复了所有错误(并且项目成功编译)之后,我的代码中仍然有发布语句

例如,在应用程序委托中,我使用以下内容:

self.loginViewController       = [[LoginViewController alloc] init];
self.window.rootViewController = self.loginViewController;
[self.window makeKeyAndVisible];
[self.loginViewController release];
据我所知,这应该会引起一个错误。但事实并非如此。该应用程序按预期工作,但给我留下的问题是,这些文件中的内存管理是否正确

AppDelegate.m和LoginViewController.m都没有设置-fno objc arc标志,因此它们应该默认为arc

我肯定做错了什么。我应该仔细检查什么


提前谢谢。

我刚刚解决了这个问题。我使用的是iRate库,它在其中一个标题中定义了release和autorelease

#define release self
#define autorelease self
我删除了那些行,问题就解决了。所以,如果您遇到类似的情况,请检查是否有第三方库定义了它们


说真的,哪个像样的程序员会这样定义“释放”和“自动释放”?太棒了…

我刚刚解决了这个问题。我使用的是iRate库,它在其中一个标题中定义了release和autorelease

#define release self
#define autorelease self
我删除了那些行,问题就解决了。所以,如果您遇到类似的情况,请检查是否有第三方库定义了它们


说真的,哪个像样的程序员会这样定义“释放”和“自动释放”?惊人…

您是否使用了编辑->重构->转换为Objective-C ARC?我发现这是转换到arc的最简单的方法,我尝试过,但没有成功,因为它仍然尝试将我的非arc外部库转换为arc,尽管我已经为它们设置了-fno-objc-arc标志。我不想弄乱那些图书馆。有没有办法指定哪些文件将被重构?我找到了。目标文件实际上会展开并向您显示将要转换和不会转换的文件。我刚刚完成重构,它确实帮了很多忙。我查看了更改并保存了。但是,它仍然没有在某些文件(如委托)中检测到显式消息。出于某种原因,XCode似乎忽略了这些用于圆弧转换的文件。非常奇怪..您是否使用了编辑->重构->转换为Objective-C圆弧?我发现这是转换到arc的最简单的方法,我尝试过,但没有成功,因为它仍然尝试将我的非arc外部库转换为arc,尽管我已经为它们设置了-fno-objc-arc标志。我不想弄乱那些图书馆。有没有办法指定哪些文件将被重构?我找到了。目标文件实际上会展开并向您显示将要转换和不会转换的文件。我刚刚完成重构,它确实帮了很多忙。我查看了更改并保存了。但是,它仍然没有在某些文件(如委托)中检测到显式消息。出于某种原因,XCode似乎忽略了这些用于圆弧转换的文件。非常奇怪……实际上是非常聪明的人。我敢打赌他们这么做是为了向后兼容非ARC。他们必须已经做了一个有条件的定义,并使发布在arc下不做任何事情。聪明。你应该使用它。我不介意这个定义的范围是否保留在他们自己的代码中,但它也会影响我的代码。因此,如果我在一个ARC项目中导入iRate.h,在一个专门禁用了ARC的类中,define将扩展到我的类并中断我的发布语句,对吗?我并不是想变得聪明,这正是我现在在应用商店里的一个应用的情况。实际上,非常聪明的应用。我敢打赌他们这么做是为了向后兼容非ARC。他们必须已经做了一个有条件的定义,并使发布在arc下不做任何事情。聪明。你应该使用它。我不介意这个定义的范围是否保留在他们自己的代码中,但它也会影响我的代码。因此,如果我在一个ARC项目中导入iRate.h,在一个专门禁用了ARC的类中,define将扩展到我的类并中断我的发布语句,对吗?我并不是想变得聪明,这正是我现在在应用商店中使用的一款应用的情况。