测试代码
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated{
NSLog(@"setViewControllers animated%@",viewControllers);
[super setViewControllers:viewControllers animated:animated];
NSLog(@"真实的%@ ",self.viewControllers);
}
打印一下可以发现并不一样 ,为什么呢?
源码看看setViewControllers 就是调用的setViewControllers:animated
void -[UINavigationController setViewControllers:](void * self, void * _cmd, void * arg2) {
[self setViewControllers:arg2 animated:0x0];
return;
}
void -[UINavigationController setViewControllers:animated:](void * self, void * _cmd, void * arg2, bool arg3) {
r12 = arg3;
r14 = _cmd;
rbx = self;
rax = [arg2 retain];
var_-104 = __NSConcreteStackBlock;
var_-56 = rax;
*(&var_-104 + 0x8) = 0xc2000000;
*(&var_-104 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke;
*(&var_-104 + 0x18) = ___block_descriptor_tmp.416;
*(&var_-104 + 0x20) = rbx;
var_-48 = objc_retainBlock(&var_-104);
r13 = [[rbx _transitionCoordinator] retain];
if (r13 == 0x0) goto loc_2a03e8;
loc_2a0366:
if ([rbx _transitionConflictsWithNavigationTransitions:r13] == 0x0) goto loc_2a04ab;
loc_2a0381:
r14 = [NSStringFromSelector(r14) retain];
r12 = [NSStringFromClass([rbx class]) retain];
NSLog(@"%@ called on <%@ %p> while an existing transition or presentation is occurring; the navigation stack will not be updated.", r14, r12, rbx);
[r12 release];
[r14 release];
r15 = var_-56;
goto loc_2a05ba;
loc_2a05ba:
r14 = var_-48;
goto loc_2a05d6;
loc_2a05d6:
[r13 release];
[r14 release];
[r15 release];
return;
loc_2a04ab:
if ((r12 != 0x0) || ([r13 presentationStyle] == 0xffffffffffffffff)) goto loc_2a0559;
loc_2a04ce:
var_-152 = __NSConcreteStackBlock;
*(&var_-152 + 0x8) = 0xc2000000;
*(&var_-152 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke.426;
*(&var_-152 + 0x18) = ___block_descriptor_tmp.429;
r14 = var_-48;
*(&var_-152 + 0x20) = [r14 retain];
r15 = var_-56;
*(&var_-152 + 0x28) = [var_-56 retain];
[UIViewController _performWithoutDeferringTransitions:&var_-152];
[*(&var_-152 + 0x28) release];
[*(&var_-152 + 0x20) release];
goto loc_2a05d6;
loc_2a0559:
var_-264 = __NSConcreteStackBlock;
*(&var_-264 + 0x8) = 0xc2000000;
*(&var_-264 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke.432;
*(&var_-264 + 0x18) = ___block_descriptor_tmp.436;
*(&var_-264 + 0x20) = rbx;
r15 = var_-56;
*(&var_-264 + 0x28) = [r15 retain];
*(int8_t *)(&var_-264 + 0x30) = r12;
[r13 animateAlongsideTransition:0x0 completion:&var_-264];
[*(&var_-264 + 0x28) release];
goto loc_2a05ba;
loc_2a03e8:
if (([rbx _isTransitioning] == 0x0) && ([rbx needsDeferredTransition] == 0x0)) {
r14 = var_-48;
r15 = var_-56;
(*(r14 + 0x10))(r14, r15, r12 & 0xff);
}
else {
if (r12 != 0x0) {
var_-208 = __NSConcreteStackBlock;
*(&var_-208 + 0x8) = 0xc2000000;
*(&var_-208 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke.443;
var_-64 = *_UIApp;
*(&var_-208 + 0x18) = ___block_descriptor_tmp.446;
r14 = var_-48;
*(&var_-208 + 0x20) = [r14 retain];
r15 = var_-56;
*(&var_-208 + 0x28) = [r15 retain];
*(int8_t *)(&var_-208 + 0x30) = r12;
[var_-64 _performBlockAfterCATransactionCommits:&var_-208];
[*(&var_-208 + 0x28) release];
[*(&var_-208 + 0x20) release];
}
else {
r14 = var_-48;
r15 = var_-56;
(*(r14 + 0x10))(r14, r15, r12 & 0xff);
}
}
goto loc_2a05d6;
}
int ___54-[UINavigationController setViewControllers:animated:]_block_invoke(int arg0, int arg1, int arg2) {
rbx = arg2;
var_C0 = arg0;
r15 = [arg1 retain];
rax = __UIApplicationUsesLegacyUI();
var_E0 = r15;
var_B4 = rbx;
if (rax == 0x0) goto loc_2a06a5;
loc_2a064b:
var_C4 = 0x0;
if (rbx == 0x0) goto loc_2a0806;
loc_2a065d:
rbx = [[*(var_C0 + 0x20) mutableChildViewControllers] retain];
rcx = r15;
rax = [*(var_C0 + 0x20) _transitionForOldViewControllers:rbx newViewControllers:rcx];
r15 = r15;
goto loc_2a07f7;
loc_2a07f7:
var_C4 = rax;
[rbx release];
goto loc_2a0806;
loc_2a0806:
rbx = [r15 retain];
r14 = [rbx count];
if (r14 != 0x0) {
var_D0 = 0x0;
r13 = 0x0;
var_100 = rbx;
do {
r15 = r13;
r13 = r14;
r14 = r13 + 0xffffffffffffffff;
rdx = r14;
rax = [rbx objectAtIndex:rdx];
rax = [rax retain];
var_D8 = rax;
rsi = @selector(useLayoutToLayoutNavigationTransitions);
if (_objc_msgSend(rax, rsi) != 0x0) {
r13 = r15;
if (r13 != 0x0) {
rsi = @selector(addIndex:);
rdx = r14;
_objc_msgSend(r13, rsi, rdx);
}
else {
rbx = _objc_msgSend;
r13 = [[NSMutableIndexSet indexSetWithIndex:r14] retain];
rax = var_D0;
if (rax != 0x0) {
rsi = @selector(addObject:);
rdx = r13;
(rbx)(rax, rsi, rdx);
}
else {
rsi = @selector(arrayWithObject:);
rdx = r13;
var_D0 = [(rbx)(@class(NSMutableArray), rsi, rdx) retain];
}
}
}
else {
if (r15 != 0x0) {
if ([var_D8 isKindOfClass:[UICollectionViewController class]] != 0x0) {
rsi = @selector(addIndex:);
rdx = r14;
_objc_msgSend(r15, rsi, rdx);
}
else {
rbx = [[var_100 objectAtIndex:r13] retain];
rcx = 0x0;
[rbx _setUseLayoutToLayoutNavigationTransitions:0x0 withCheck:rcx];
rsi = @selector(addIndex:);
rdx = r13;
_objc_msgSend(r15, rsi, rdx);
[rbx release];
}
[r15 release];
r13 = 0x0;
}
else {
r13 = 0x0;
}
}
[var_D8 release];
rbx = var_100;
} while (r14 != 0x0);
if (r13 != 0x0) {
r14 = [[rbx objectAtIndex:0x0] retain];
[r14 _setUseLayoutToLayoutNavigationTransitions:0x0 withCheck:0x0];
[r13 addIndex:0x0];
[r14 release];
[r13 release];
}
r15 = var_E0;
r13 = var_D0;
}
else {
r13 = 0x0;
}
r14 = var_B4;
[rbx release];
if (r13 != 0x0) {
r12 = rbx;
*(int128_t *)(&var_170 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_170 + 0x30), 0x0);
*(int128_t *)(&var_170 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_170 + 0x20), 0x0);
*(int128_t *)(&var_170 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_170 + 0x10), 0x0);
var_170 = intrinsic_movaps(var_170, 0x0);
var_D0 = r13;
rax = [r13 retain];
var_D8 = rax;
r14 = [rax countByEnumeratingWithState:&var_170 objects:&var_B0 count:0x10];
if (r14 != 0x0) {
r13 = **(&var_170 + 0x10);
do {
rbx = 0x0;
do {
if (*var_160 != r13) {
objc_enumerationMutation(var_D8);
}
[*(var_C0 + 0x20) _prepareCollectionViewControllers:r12 forSharingInRange:*(var_168 + rbx * 0x8)];
rbx = rbx + 0x1;
} while (rbx < r14);
r14 = [var_D8 countByEnumeratingWithState:&var_170 objects:&var_B0 count:0x10];
} while (r14 != 0x0);
}
[var_D8 release];
r15 = var_E0;
r14 = var_B4;
rbx = r12;
r13 = var_D0;
}
[*(var_C0 + 0x20) _setViewControllers:rbx transition:var_C4 animated:r14 & 0xff];
[r13 release];
goto loc_2a0c1a;
loc_2a0c1a:
[r15 release];
rax = *___stack_chk_guard;
if (rax != *___stack_chk_guard) {
rax = __stack_chk_fail();
}
return rax;
loc_2a06a5:
if (r15 == 0x0) goto loc_2a06ff;
loc_2a06aa:
r13 = r15;
rbx = [[*(var_C0 + 0x20) mutableChildViewControllers] retain];
r15 = [r13 isEqualToArray:rbx];
[rbx release];
COND = r15 == 0x0;
r15 = r13;
if (COND) goto loc_2a07b8;
loc_2a06ff:
if ([r15 count] == 0x0) goto loc_2a07ae;
loc_2a0718:
r15 = [[var_E0 lastObject] retain];
r12 = [[r15 view] retain];
rbx = [[*(var_C0 + 0x20) view] retain];
r14 = [r12 isDescendantOfView:rbx];
[rbx release];
[r12 release];
[r15 release];
r15 = var_E0;
if (r14 != 0x0) goto loc_2a0c1a;
loc_2a07ae:
r13 = r15;
goto loc_2a07b8;
loc_2a07b8:
rbx = [[*(var_C0 + 0x20) mutableChildViewControllers] retain];
r15 = r13;
rcx = r15;
rax = [*(var_C0 + 0x20) _transitionForOldViewControllers:rbx newViewControllers:rcx];
goto loc_2a07f7;
}
int -[UINavigationController _transitionForOldViewControllers:newViewControllers:](void * self, void * _cmd, void * arg2, void * arg3) {
r14 = self;
var_30 = [arg2 retain];
rbx = @selector(lastObject);
r15 = [_objc_msgSend(arg3, rbx) retain];
r12 = [r14 isMemberOfClass:[UINavigationController class]];
r13 = [[r15 _existingView] retain];
if (*(int32_t *)__UIApplicationLinkedOnVersion != 0x0) {
if (*(int32_t *)__UIApplicationLinkedOnVersion <= 0x8ffff) {
if (r13 != 0x0) {
r12 = r12 ^ 0x1;
if (r12 != 0x0) {
[r14 loadViewIfNeeded];
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
if (r13 != 0x0) {
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
r12 = 0x0;
}
}
}
else {
if (r13 != 0x0) {
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
r12 = 0x0;
}
}
}
else {
if (r13 != 0x0) {
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
r12 = 0x0;
}
}
}
else {
if (__UIApplicationLinkedOnOrAfter(0x90000) != 0x0) {
if (r13 != 0x0) {
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
r12 = 0x0;
}
}
else {
if (r13 != 0x0) {
r12 = r12 ^ 0x1;
if (r12 != 0x0) {
[r14 loadViewIfNeeded];
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
if (r13 != 0x0) {
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
r12 = 0x0;
}
}
}
else {
if (r13 != 0x0) {
if ([r14 isViewLoaded] != 0x0) {
rbx = [[r14 view] retain];
r12 = [r13 isDescendantOfView:rbx];
rdi = rbx;
rbx = @selector(lastObject);
[rdi release];
}
else {
r12 = 0x0;
}
}
else {
r12 = 0x0;
}
}
}
}
r14 = [_objc_msgSend(var_30, rbx) retain];
[r14 release];
if (r12 != 0x0) {
rbx = 0x0;
if (r15 != r14) {
rbx = 0x2 - ((r12 | [var_30 containsObject:r15] ^ 0x1) & 0xff);
}
}
else {
rbx = 0x2 - ((r12 | [var_30 containsObject:r15] ^ 0x1) & 0xff);
}
[r13 release];
[r15 release];
[var_30 release];
rax = rbx;
return rax;
}
bool -[UINavigationController _transitionConflictsWithNavigationTransitions:](void * self, void * _cmd, void * arg2) {
r14 = self;
r15 = [arg2 retain];
if ((([r15 presentationStyle] != 0x4) && ([r15 presentationStyle] != 0x3)) && ([r15 presentationStyle] != 0x6)) {
rbx = 0x0;
}
else {
r13 = [[r15 viewControllerForKey:@"UITransitionContextToViewController"] retain];
if (r13 == 0x0) {
if ([r15 presentationStyle] == 0x4) {
rax = [r15 viewControllerForKey:@"UITransitionContextFromViewController"];
rax = [rax retain];
rbx = rax != 0x0 ? 0x1 : 0x0;
rdi = rax;
}
else {
var_50 = __NSConcreteStackBlock;
*(&var_50 + 0x8) = 0xc2000000;
*(&var_50 + 0x10) = ___72-[UINavigationController _transitionConflictsWithNavigationTransitions:]_block_invoke;
*(&var_50 + 0x18) = ___block_descriptor_tmp.2175;
*(&var_50 + 0x20) = [r13 retain];
rbx = [r14 _doesSelfOrAncestorPassPredicate:&var_50] ^ 0x1;
rdi = *(&var_50 + 0x20);
}
}
else {
var_50 = __NSConcreteStackBlock;
*(&var_50 + 0x8) = 0xc2000000;
*(&var_50 + 0x10) = ___72-[UINavigationController _transitionConflictsWithNavigationTransitions:]_block_invoke;
*(&var_50 + 0x18) = ___block_descriptor_tmp.2175;
*(&var_50 + 0x20) = [r13 retain];
rbx = [r14 _doesSelfOrAncestorPassPredicate:&var_50] ^ 0x1;
rdi = *(&var_50 + 0x20);
}
[rdi release];
[r13 release];
}
[r15 release];
rax = rbx;
return rax;
}
void -[UINavigationController _setViewControllers:transition:animated:](void * self, void * _cmd, void * arg2, int arg3, bool arg4) {
[self _setViewControllers:arg2 transition:arg3 animated:arg4 operation:0x3];
return;
}
设置个控制器写这么多代码,当然立刻生效不了了😂😂😂