Iphone 目标C:处理对NSMutableArray中从中删除的对象的引用

Iphone 目标C:处理对NSMutableArray中从中删除的对象的引用,iphone,ios,objective-c,nsarray,nsmanagedobject,Iphone,Ios,Objective C,Nsarray,Nsmanagedobject,我有一个NSMutableArray的Person(NSManagedObject),它是UIViewControllerpersonviewcontroller(显示为模式)的属性,用作UITableView的数据源,用于列出所有人员。 阵列由核心数据填充。在didselectrowatinexpath上,我设置了selectedPerson,这是presentingViewController中的一个强大的非原子属性 在PersonView控制器中,用户可以从UITableView中删除项目

我有一个
NSMutableArray
Person
NSManagedObject
),它是
UIViewController
personviewcontroller(显示为模式)的属性,用作UITableView的数据源,用于列出所有人员。 阵列由核心数据填充。在
didselectrowatinexpath
上,我设置了
selectedPerson
,这是presentingViewController中的一个强大的非原子属性


在PersonView控制器中,用户可以从UITableView中删除项目。如果从数组中删除的项恰好是selectedPerson指向的对象,我如何处理引用?

由于您使用的是属性,如果选择了,只需将其设置为nil即可

[personsArray removeObject:personToDelete];
if (self.selectedPerson == personToDelete)
    self.selectedPerson = nil;

这将释放它,并且它将被解除锁定。

因为您对所选对象具有强引用,所以在删除过程中从数组中删除person对象不会影响所选的person

根据ARC,若对象至少有一个强引用,则该对象将驻留在内存中。因此,在您的情况下,从数组中删除person将取消数组对person对象的强引用,但您仍然有一个使用所选person指针的强引用


因此,被选中的人成为留在记忆中的优秀候选人,你可以毫无恐惧地使用它。

简短的答案是
selectedPerson=nil

在ARC下,将删除对对象的强引用,以便将其从内存中删除

在您的代码中,您可以进行测试

if ( selectedPerson ) 
{
    /* do something to that selected person */
}

看看你是否还有一个被选中的人。

哇,太简单了!我为什么不试试呢。我想我不确定==是否有效。非常感谢@jv360不幸的是,由于selectedPerson是一个
NSManagedObject
访问对象时,属性不再可访问,返回a。