我有一个视图控制器显示一个表格图,见下文:了解iOS存储器管理
//.h file
@interface CoreDataViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
//NSArray property
@property (retain, nonatomic) NSArray *arr;
@end
//.m file
- (void)viewDidLoad {
//fetch data from core data, pass to arr property
//context is a instance of NSManagedObjectContext
arr = [context executeFetchRequest:request error:nil];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (arr == nil) {
return 0;
}
return [arr count]; //program stop here, nothing showed up in output console
}
xcode的资料(仪表)告诉我有在返回僵尸对象[ARR计数]; 我很困惑在后台发生了什么,也许属性arr被iOS发布,但该属性在.h文件中有一个retain关键字。
我找到一个解决方案能解决这个问题,如果用的NSArray替换的NSMutableArray这样的:
@interface CoreDataViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
//change to NSMutableArray
@property (retain, nonatomic) NSMutableArray *arr;
@end
- (void)viewDidLoad {
//convert NSArray to NSMutableArray
arr = [[context executeFetchRequest:request error:nil] mutableCopy];
}
有没有保留或自动释放mutableCopy方法?
非常好的和详细的评论@罗伯特瑞恩。我习惯于用C#语法思考,所以忽略了ivar和property之间的区别。感谢您耐心回答,现在我知道了。 – rock 2012-04-25 07:54:40
不幸的是,ivars和属性之间的Objective C区分是不必要的钝化。更广泛地说,内存处理是这种语言的一个基本弱点。程序员真的不应该担心这种事情。 [ARC](http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html)让语言更接近更合适的东西(如果你没有看过它,你真的应该),但语言仍然感觉有点不合时宜。 – Rob 2012-04-25 13:17:11