配方示例

RecipeAddViewController *addController = [[RecipeAddViewController alloc]
                  initWithNibName:@"RecipeAddView" bundle:nil];
addController.delegate = self;

Recipe *newRecipe = [NSEntityDescription
                  insertNewObjectForEntityForName:@"Recipe"
                  inManagedObjectContext:self.managedObjectContext];
addController.recipe = newRecipe;

UINavigationController *navigationController = [[UINavigationController alloc]
                  initWithRootViewController:addController];
[self presentModalViewController:navigationController animated:YES];

[navigationController release];
[addController release];



presentModalViewController和initWithRootViewController保留其参数并取得所有权。然后释放两个对象,证明有人拥有了所有权。因此,总的来说,我如何知道哪个消息将最终获得所有权以释放相应的对象?
由于托管对象的生命周期与我无关,因此不会发布newRecipe,这条语句正确吗?


UPD:
对#2感到抱歉,答案是它被addController保留,然后在addController的dealloc中释放。

最佳答案

最简单的形式是:


  如果保留它,则将其释放。


但是,通过保留,我的意思是“增加保留数”,因此创建一个新对象(除非它是自动释放的)也算作保留。

所以:


如果调用alloc,则将其释放。
如果调用copy,则将其释放。
如果调用retain,则将其释放。


除了这三种情况,您不必担心发布(假设您使用的第三方库遵循命名约定)。但是,如果您必须知道要保留的内容和不保留的内容,则可以查看相关类的文档。

例如:


工厂方法(如[NSString stringWithFormat:])创建自动释放的对象。根据经验,如果它是一个以类名开头的类方法,它将返回一个自动释放的对象。
insertNewObjectForEntityForName:inManagedObjectContext:返回一个自动释放的对象。这在documentation for NSEntityDescription中。
代表几乎从不保留,以防止保留周期。
除委托人外,您无需关心课程中发生的事情。如果将属性传递给它,则它的工作就是保留或复制它(如果需要)。您需要关心的是平衡保留和释放。

关于objective-c - 如何知道谁将拥有所有权?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3185548/

10-09 01:50