Objective c 使用NSMutableArray作为队列不工作

Objective c 使用NSMutableArray作为队列不工作,objective-c,uiviewcontroller,nsmutablearray,Objective C,Uiviewcontroller,Nsmutablearray,使用NSMutableArray作为队列时出现奇怪的问题 给定一个singleton对象SO、一个ViewController对象VC和一个NSMutableArray MA。 MA被用作SO接收的ID的队列,并通过将ID放入MA并发送VC处理的通知传递给VC。马失去了它所持有的东西,这是一个问题 与问题有关的步骤: 启动Seque以加载视图 所以从服务器请求一个ID VC的viewDidLoad完成 所以block函数接收一个ID并将其放入MA中,然后向VC发送一个通知 VC接收通知并从MA检

使用NSMutableArray作为队列时出现奇怪的问题

给定一个singleton对象SO、一个ViewController对象VC和一个NSMutableArray MA。 MA被用作SO接收的ID的队列,并通过将ID放入MA并发送VC处理的通知传递给VC。马失去了它所持有的东西,这是一个问题

与问题有关的步骤:

  • 启动Seque以加载视图
  • 所以从服务器请求一个ID
  • VC的viewDidLoad完成
  • 所以block函数接收一个ID并将其放入MA中,然后向VC发送一个通知
  • VC接收通知并从MA检索ID
  • 第一次加载视图时没有问题。但是,如果我离开视图,回到视图中,重复上面的步骤,步骤4中MA的大小为1,步骤5中MA的大小为0。也就是说,妈妈变空了

    在发送通知(步骤4)和调用通知处理程序(步骤5)之间,MA是如何神秘地变为空的,我对此感到困惑。我已经检查过VC通知处理程序之外没有任何东西正在清除数组

    一个可能的线索是,viewDidLoad中有一个名为(用obj C术语发送的消息)的方法,如果注释掉了,则所描述的问题不会发生。另外,如果我在viewDidLoad中的方法后面放了以下行(而不是注释掉),则问题将停止发生:

    [[NSRunLoop currentRunLoop]runUntelDate:[NSDate Date WithTimeIntervalencesInnow:0.5]]

    这件事让我抓狂。我最近的想法是,NSMutableArray有一些我不理解的地方。我以为MA存储了对放置在其中的ID的强引用,但如果不是,那么可能会有一些奇怪之处


    有人有想法吗?

    问题是每次VC的viewDidLoad完成时都会调用NSNotificationCenter addObserver:(步骤3)。这导致通知处理程序被调用的次数与添加的次数相同,即使通知本身只发布了一次


    以下是相关的:

    如何从可变数组中删除标识符?是谁干的?您是否100%确定处理的是同一个数组,或者它是否可能被重新实例化或复制?(在这些不同的调用中比较与数组本身关联的地址。)另外,您确定这都发生在主线程上吗?换句话说,如何同步非线程安全的NSMutableArray?(顺便说一句,如果我的理解是正确的,一个对象在添加项,另一个对象在删除项,我对此很警惕。我宁愿看到一个接口来协调这一点。)指向MA的指针是SO的一个属性,并且它在appDelegate的didFinishLaunchingWithOptions中被alloc'd和init'd。VC通知处理程序将使用removeObjectAtIndex:0删除收到的单个ID。指向MA的指针是SO的一个属性,它在appDelegate的didFinishLaunchingWithOptions中是alloc'd和init'd。我没有同步非线程安全的MA,但我只是在步骤4中通过SO block函数将ID放入MA中,在步骤4中发送通知,并在步骤5中检索。更正,从objectAtIndex为0的数组中获取对ID的引用,然后从removeObjectAtIndex为0的数组中清除。算法看起来正确,但由于您对它有问题,所以实现是错误的。试着看看NSNotificationCenter,它实际上实现了您想要重新发明的功能