/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore
查了很多是上面这个。
下面是UINavigationController的一些伪源码
[UINavigationController popToRootViewControllerAnimated ]什么时候返回空值
这是声明 popToRootViewControllerAnimated
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;
// Pops until there's only a single view controller left on the stack. Returns the popped controllers.
但没有说返回nil是怎么回事
hopper 一下 uikit
UIKit.framework二进制文件在哪里
/System/Library/Frameworks/UIKit.framework/UIKit 这个找不到
/System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation 这个不是啊
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore 查了很多是这个。
这是hopper出来的
void * -[UINavigationController popToRootViewControllerAnimated:](void * self, void * _cmd, bool arg2) {
rax = [self popToRootViewControllerWithTransition:arg2 + arg2];
return rax;
}
void * -[UINavigationController popToRootViewControllerWithTransition:](void * self, void * _cmd, int arg2) {
r14 = arg2;
r15 = self;
r12 = [[self mutableChildViewControllers] retain];
if ([r12 count] >= 0x2) {
r13 = [[r12 objectAtIndex:0x0] retain];
rbx = [[r15 popToViewController:r13 transition:r14] retain];
[r13 release];
}
else {
rbx = 0x0;
}
[r12 release];
rax = [rbx autorelease];
return rax;
}
上面代码说[self mutableChildViewControllers] < 2是nil 但打印完不是
那就是pop到第一个vc
void * -[UINavigationController popToViewController:transition:](void * self, void * _cmd, void * arg2, int arg3) {
var_34 = arg3;
r15 = self;
rax = [arg2 retain];
var_80 = __NSConcreteStackBlock;
*(&var_80 + 0x8) = 0xc2000000;
rcx = ___57-[UINavigationController popToViewController:transition:]_block_invoke;
*(&var_80 + 0x10) = rcx;
var_30 = rax;
*(&var_80 + 0x18) = ___block_descriptor_tmp.2146;
*(&var_80 + 0x20) = r15;
var_50 = _cmd;
*(&var_80 + 0x28) = _cmd;
var_40 = objc_retainBlock(&var_80);
r13 = [[r15 _transitionCoordinator] retain];
r12 = [[r15 _existingView] retain];
rbx = [[r12 window] retain];
[rbx release];
[r12 release];
var_48 = r13;
if ((r13 != 0x0) || (rbx == 0x0)) goto loc_2c23e1;
loc_2c23b1:
if ([r15 _isTransitioning] == 0x0) goto loc_2c2489;
loc_2c23c9:
rbx = var_34;
r12 = var_30;
r13 = var_40;
if (rbx != 0x0) goto loc_2c24b4;
loc_2c25c5:
rsi = r12;
rdx = rbx;
r15 = [(*(r13 + 0x10))(r13, rsi, rdx) retain];
goto loc_2c268c;
loc_2c268c:
[var_48 release];
[r13 release];
[r12 release];
rax = [r15 autorelease];
return rax;
loc_2c24b4:
rcx = __NSConcreteStackBlock;
var_130 = rcx;
var_30 = *_UIApp;
*(&var_130 + 0x8) = 0xc2000000;
*(&var_130 + 0x10) = ___57-[UINavigationController popToViewController:transition:]_block_invoke.2155;
*(&var_130 + 0x18) = ___block_descriptor_tmp.2158;
*(&var_130 + 0x20) = r15;
*(&var_130 + 0x28) = [r12 retain];
*(&var_130 + 0x30) = [r13 retain];
*(int32_t *)(&var_130 + 0x38) = rbx;
rsi = @selector(_performBlockAfterCATransactionCommits:);
rdx = &var_130;
_objc_msgSend(var_30, rsi);
[*(&var_130 + 0x30) release];
rdi = *(&var_130 + 0x28);
goto loc_2c2687;
loc_2c2687:
[rdi release];
r15 = 0x0;
goto loc_2c268c;
loc_2c2489:
rax = [r15 needsDeferredTransition];
rbx = var_34;
r12 = var_30;
r13 = var_40;
if ((rbx == 0x0) || (rax == 0x0)) goto loc_2c25c5;
goto loc_2c24b4;
loc_2c23e1:
if ([r15 _transitionConflictsWithNavigationTransitions:var_48] == 0x0) goto loc_2c253f;
loc_2c23fd:
r14 = [NSStringFromSelector(var_50) retain];
rbx = [NSStringFromClass([r15 class]) retain];
rdx = rbx;
rcx = r15;
NSLog(@"%@ called on <%@ %p> while an existing transition or presentation is occurring; the navigation stack will not be updated.", r14, rdx, rcx);
[rbx release];
[r14 release];
rsi = @selector(array);
r15 = [_objc_msgSend(@class(NSArray), rsi) retain];
r12 = var_30;
r13 = var_40;
goto loc_2c268c;
loc_2c253f:
COND = rbx == 0x0;
rbx = var_34;
if (COND) goto loc_2c2603;
loc_2c254b:
if (rbx == 0x0) goto loc_2c25e8;
loc_2c2553:
var_B8 = __NSConcreteStackBlock;
*(&var_B8 + 0x8) = 0xc2000000;
*(&var_B8 + 0x10) = ___57-[UINavigationController popToViewController:transition:]_block_invoke.2151;
*(&var_B8 + 0x18) = ___block_descriptor_tmp.2154;
*(&var_B8 + 0x20) = r15;
r12 = var_30;
*(&var_B8 + 0x28) = [r12 retain];
*(int32_t *)(&var_B8 + 0x30) = rbx;
rsi = @selector(animateAlongsideTransition:completion:);
r15 = 0x0;
rdx = 0x0;
rcx = &var_B8;
_objc_msgSend(var_48, rsi);
[*(&var_B8 + 0x28) release];
r13 = var_40;
goto loc_2c268c;
loc_2c25e8:
if ([var_48 presentationStyle] == 0xffffffffffffffff) goto loc_2c2553;
loc_2c2603:
var_F0 = __NSConcreteStackBlock;
*(&var_F0 + 0x8) = 0xc2000000;
*(&var_F0 + 0x10) = ___57-[UINavigationController popToViewController:transition:]_block_invoke.2147;
*(&var_F0 + 0x18) = ___block_descriptor_tmp.2150;
r13 = var_40;
rax = [r13 retain];
rcx = _objc_retain;
*(&var_F0 + 0x20) = rax;
r12 = var_30;
*(&var_F0 + 0x28) = [r12 retain];
*(int32_t *)(&var_F0 + 0x30) = rbx;
rsi = @selector(_performWithoutDeferringTransitions:);
rdx = &var_F0;
_objc_msgSend(@class(UIViewController), rsi);
[*(&var_F0 + 0x28) release];
rdi = *(&var_F0 + 0x20);
goto loc_2c2687;
}
int ___57-[UINavigationController popToViewController:transition:]_block_invoke(int arg0, int arg1, int arg2) {
r15 = arg2;
r12 = arg0;
r14 = [arg1 retain];
r13 = [[*(r12 + 0x20) mutableChildViewControllers] retain];
rbx = [[*(r12 + 0x20) topViewController] retain];
[rbx release];
if (rbx == r14) goto loc_2c2878;
loc_2c2734:
var_CC = r15;
rbx = [r13 indexOfObjectIdenticalTo:r14];
if (rbx == 0x7fffffffffffffff) {
rax = [NSString stringWithUTF8String:"/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3698.93.8/UINavigationController.m"];
rax = [rax retain];
var_B8 = r13;
r13 = rax;
rdi = @"<Unknown File>";
if (r13 != 0x0) {
rdi = r13;
}
rax = [rdi retain];
[r13 release];
r13 = [[NSAssertionHandler currentHandler] retain];
[r13 handleFailureInMethod:*(r12 + 0x28) object:*(r12 + 0x20) file:rax lineNumber:0x1ff0 description:@"Tried to pop to a view controller that doesn't exist."];
r14 = r14;
[rax release];
rdi = r13;
r13 = var_B8;
[rdi release];
}
rax = [r13 count];
var_D8 = rbx + 0x1;
r15 = rax - rbx + 0x1;
if (rax - rbx + 0x1 == 0x1) goto loc_2c295a;
loc_2c2792:
if (*(int32_t *)__UIApplicationLinkedOnVersion == 0x0) goto loc_2c2948;
loc_2c27a3:
if (*(int32_t *)__UIApplicationLinkedOnVersion <= 0x7ffff) goto loc_2c295a;
loc_2c27ae:
var_C8 = r12;
var_C0 = r14;
r14 = [r13 indexOfObjectIdenticalTo:r14];
if (r14 == 0x7fffffffffffffff) {
rbx = [[NSString stringWithUTF8String:"/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3698.93.8/UINavigationController.m"] retain];
rdi = @"<Unknown File>";
if (rbx != 0x0) {
rdi = rbx;
}
r12 = [rdi retain];
[rbx release];
rbx = [[NSAssertionHandler currentHandler] retain];
[rbx handleFailureInMethod:*(var_C8 + 0x28) object:*(var_C8 + 0x20) file:r12 lineNumber:0x2012 description:@"Tried to pop to a view controller that doesn't exist."];
[r12 release];
[rbx release];
r13 = r13;
}
r12 = [[r13 subarrayWithRange:r14 + 0x1] retain];
rcx = r14 + 0x1;
r14 = [[r13 subarrayWithRange:0x0] retain];
r13 = r13;
[*(var_C8 + 0x20) _setViewControllers:r14 transition:rcx animated:var_CC != 0x0 ? 0x1 : 0x0 operation:0x2];
[r14 release];
r14 = var_C0;
goto loc_2c2bcb;
loc_2c2bcb:
[r13 release];
[r14 release];
if (*___stack_chk_guard == *___stack_chk_guard) {
rax = [r12 autorelease];
}
else {
rax = __stack_chk_fail();
}
return rax;
loc_2c295a:
var_E0 = [[[NSMutableArray alloc] init] autorelease];
r15 = r15 - 0x1;
if (r15 != 0x0) {
var_C8 = r12;
var_C0 = r14;
var_B8 = r13;
var_E8 = r15;
rax = [r13 subarrayWithRange:var_D8];
rax = [rax retain];
*(int128_t *)(&var_130 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_130 + 0x30), 0x0);
*(int128_t *)(&var_130 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_130 + 0x20), 0x0);
*(int128_t *)(&var_130 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_130 + 0x10), 0x0);
r15 = rax;
var_130 = intrinsic_movaps(var_130, 0x0);
r14 = [r15 countByEnumeratingWithState:&var_130 objects:&var_B0 count:0x10];
if (r14 != 0x0) {
rbx = **(&var_130 + 0x10);
do {
r12 = 0x0;
do {
if (*var_120 != rbx) {
objc_enumerationMutation(r15);
}
[*(var_128 + r12 * 0x8) removeFromParentViewController];
r12 = r12 + 0x1;
} while (r12 < r14);
r14 = [r15 countByEnumeratingWithState:&var_130 objects:&var_B0 count:0x10];
} while (r14 != 0x0);
}
[var_E0 addObjectsFromArray:r15];
r12 = var_C8;
if ([*(r12 + 0x20) isNavigationBarHidden] == 0x0) {
rbx = [[*(*(r12 + 0x20) + *ivar_offset(_navigationBar)) items] retain];
r14 = [rbx mutableCopy];
[rbx release];
[r14 removeObjectsInRange:var_D8];
[*(*(var_C8 + 0x20) + *ivar_offset(_navigationBar)) _setItems:r14 transition:0x0];
[r14 release];
r12 = var_C8;
}
[r15 release];
r14 = var_C0;
r13 = var_B8;
}
r15 = [[*(r12 + 0x20) popViewControllerWithTransition:var_CC] retain];
if (r15 == 0x0) {
rbx = [[NSString stringWithUTF8String:"/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3698.93.8/UINavigationController.m"] retain];
rdi = @"<Unknown File>";
if (rbx != 0x0) {
rdi = rbx;
}
rax = [rdi retain];
[rbx release];
rbx = [[NSAssertionHandler currentHandler] retain];
[rbx handleFailureInMethod:*(r12 + 0x28) object:*(r12 + 0x20) file:rax lineNumber:0x200c description:@"Failed to get popped view controller."];
r14 = r14;
[rax release];
[rbx release];
r13 = r13;
}
rbx = var_E0;
[rbx addObject:r15];
[r15 release];
goto loc_2c2bbf;
loc_2c2bbf:
r12 = [rbx retain];
goto loc_2c2bcb;
loc_2c2948:
if (__UIApplicationLinkedOnOrAfter(0x80000) != 0x0) goto loc_2c27ae;
goto loc_2c295a;
loc_2c2878:
rbx = 0x0;
goto loc_2c2bbf;
}
void -[UINavigationController _setViewControllers:transition:animated:operation:](void * self, void * _cmd, void * arg2, int arg3, bool arg4, long long arg5) {
var_-56 = arg3;
var_-88 = _cmd;
rbx = [arg2 retain];
var_-96 = arg5;
var_-68 = arg4;
var_-80 = self;
if (*(int32_t *)__UIApplicationLinkedOnVersion != 0x0) {
var_-49 = *(int32_t *)__UIApplicationLinkedOnVersion > 0x6ffff ? 0x1 : 0x0;
}
else {
var_-49 = __UIApplicationLinkedOnOrAfter(0x70000);
}
rdx = rbx;
r13 = [[NSSet setWithArray:rdx] retain];
r14 = [r13 count];
var_-64 = rbx;
r12 = [rbx count];
[r13 release];
if (var_-49 != 0x0) {
r13 = var_-80;
if (r14 != r12) {
rbx = [[NSString stringWithUTF8String:"/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3698.93.8/UINavigationController.m"] retain];
rdi = @"<Unknown File>";
if (rbx != 0x0) {
rdi = rbx;
}
rdx = "/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3698.93.8/UINavigationController.m";
r15 = [rdi retain];
[rbx release];
rbx = [[NSAssertionHandler currentHandler] retain];
[rbx handleFailureInMethod:var_-88 object:r13 file:r15 lineNumber:0x43f description:stack[2048]];
[r15 release];
[rbx release];
}
}
else {
r13 = var_-80;
if (r14 != r12) {
r15 = *(___UILogGetCategoryCachedImpl("Assert", __setViewControllers:transition:animated:operation:.__s_category) + 0x8);
if (os_log_type_enabled(r15, 0x10) != 0x0) {
*(int32_t *)(rsp + 0xfffffffffffffff0) = 0x8400102;
*(rsp + 0xfffffffffffffff4) = var_-64;
rbx = [r15 retain];
_os_log_impl(0xffffffffffd5e5a0, rbx, 0x10, "All view controllers in a navigation controller must be distinct (%@)", rsp + 0xfffffffffffffff0, 0xc);
[rbx release];
}
}
}
var_-144 = __NSConcreteStackBlock;
*(&var_-144 + 0x8) = 0xc2000000;
*(&var_-144 + 0x10) = ___76-[UINavigationController _setViewControllers:transition:animated:operation:]_block_invoke;
*(&var_-144 + 0x18) = ___block_descriptor_tmp.492;
*(&var_-144 + 0x20) = r13;
*(&var_-144 + 0x28) = var_-88;
rbx = var_-64;
[rbx enumerateObjectsUsingBlock:rdx];
r15 = var_-96;
r12 = var_-68;
if (var_-56 == 0x0) {
if (*(int32_t *)__UIApplicationLinkedOnVersion != 0x0) {
rcx = 0x0;
if (*(int32_t *)__UIApplicationLinkedOnVersion >= 0x70000) {
r14 = [[r13 mutableChildViewControllers] retain];
var_-56 = [r13 _transitionForOldViewControllers:r14 newViewControllers:rbx];
[r14 release];
rcx = var_-56;
}
}
else {
rax = __UIApplicationLinkedOnOrAfter(0x70000);
rcx = 0x0;
if (rax != 0x0) {
r14 = [[r13 mutableChildViewControllers] retain];
var_-56 = [r13 _transitionForOldViewControllers:r14 newViewControllers:rbx];
[r14 release];
rcx = var_-56;
}
}
}
[r13 _setViewControllers_7_0:rbx transition:rcx animated:r12 & 0xff operation:r15];
[rbx release];
if (*___stack_chk_guard != *___stack_chk_guard) {
__stack_chk_fail();
}
return;
}