配方示例
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/