在Mac和iOS平台上,内存泄漏通常是由未发布的指针引起的.传统上,检查您的分配,副本和保留以确保每个都有相应的发布消息始终是至关重要的.
Xcode 4.2附带的工具链引入了最新版本的LLVM编译器的自动引用计数(ARC),通过让编译器为您的内存管理来完全解决这个问题.这非常酷,它确实减少了大量不必要的,平凡的开发时间,并防止了很多粗心的内存泄漏,这些泄漏很容易通过适当的保留/释放平衡来修复.当您为Mac和iOS应用程序启用ARC时,甚至需要以不同方式管理自动释放池(因为您不应再分配自己的NSAutoreleasePools).
但是,其他的内存泄漏它不能阻止我仍然要注意?
作为奖励,Mac OS X和iOS上的ARC与Mac OS X上的垃圾收集有什么区别?
我已将项目切换到ARC,我不明白是否必须使用strong或weak用于IBOutlets.Xcode执行此操作:在界面构建器中,如果创建一个UILabel例如我将它与助理编辑器连接到我的ViewController,它创建:
@property (nonatomic, strong) UILabel *aLabel;
Run Code Online (Sandbox Code Playgroud)
它使用了strong,而不是我在RayWenderlich网站上阅读的教程说:
但对于这两个特殊属性我还有其他计划.而不是
strong,我们将其声明为weak.
@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar;
Run Code Online (Sandbox Code Playgroud)
Weak是所有插座属性的推荐关系.这些视图对象已经是视图控制器视图层次结构的一部分,不需要在其他地方保留.声明出口的最大好处weak是可以节省编写viewDidUnload方法的时间.目前我们
viewDidUnload看起来像这样:
- (void)viewDidUnload
{
[super viewDidUnload];
self.tableView = nil;
self.searchBar = nil;
soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)
您现在可以将其简化为以下内容:
- (void)viewDidUnload
{
[super viewDidUnload];
soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)
所以使用weak,而不是strong,并删除设置为nil videDidUnload,而不是Xcode使用strong,并使用self... = nil …
weak-references ios ios5 automatic-ref-counting strong-references
我有一个项目,其中包含一些使用ARC的文件,有些则没有.那些没有禁用ARC的编译器标志的那些.这很好.
我还想确保我的库编译LLVM-GCC和LLVM编译器.
我有这样的房产:
@property (strong, nonatomic) NSString *foo;
Run Code Online (Sandbox Code Playgroud)
但是,当我在LLVM-GCC中编译时,我得到:
"在'强'之前预期属性属性"
如果我改变强势保留,它编译好.Strong在LLVM编译器中也可以正常工作.
我错过了什么?保留不是强有力的代名词吗?