You're probably tearing down more of the stack than you need to during an IP address change. However, even still, you should probably re-compile PJSIP with PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER (and the same for TLS if you use TLS) when running on iOS.
The default behavior of PJSIP is to bind to port 5060 to receive incoming signaling messages. Chances are there's either a race condition or something wrong with your teardown process that keeps a hold on that ephemeral port during your IP change.
However, when running on iOS, this is largely pointless anyway. It's incredibly unlikely that an iOS device will be connected without a NAT/firewall in front of it that would block incoming connections anyway. Having something listen on port 5060 is not going to accomplish much. Instead, what you generally want to do, is use RFC 5626 for your PJSIP account. This way, your client registers with a random local ephemeral port with your SIP server. Once registration is successful, it keeps the connection open to your SIP proxy. Your proxy should then use the already-established connection to deliver incoming calls and signaling messages for active calls.
Ideally, though, you should move away from registrations for iOS devices entirely. Apple has already deprecated parking background TCP connections when the app is inactive, and prefers that you use VoIP push notifications to deliver incoming calls.
Hopefully this is helpful.
Best,
Colin