У меня никогда не было успеха с
[NSObject cancelPreviousPerformRequestsWithTarget:(id)]
Так что вместо этого я использую
[NSObject cancelPreviousPerformRequestsWithTarget:(id) selector:(selector) object:(id)]
Единственным недостатком является то, что вы должны делать один вызов последнему для каждого отложенного исполнения, которое вы настроили ранее.
Надеюсь, это кому-нибудь поможет. Понятия не имею, почему первый, кажется, не работает для меня.