最近升级到xcode10.2 之后 项目中使用HUD的时候,出现了卡住的情况,日志输出如下
测试之后 只发现在iphone Xs Max (也许有更多机型)在连线真机调试时才会出现,不调试的情况下会正常运行。
最后找到问题代码如下
SVP
[self.hudView addMotionEffect:effectGroup];
MB
[bezelView addMotionEffect:group];
得出结论 多半是因为 addMotionEffect 方法卡住了主线程
解决思路:
addMotionEffect 效果为添加一个背景视差效果,屏蔽后并不影响HUD的核心动画,则在真机debug时 在iphone xs max时跳过即可
首先获取真机连接xcode调试状态
感谢这位大兄弟的博客 https://www.jianshu.com/p/a9199c511cd8
#include
#include
#include
#include
#include
static bool AmIBeingDebugged(void)
// Returns true if the current process is being debugged (either
// running under the debugger or has a debugger attached post facto).
{
int junk;
int mib[4];
struct kinfo_proc info;
size_t size;
// Initialize the flags so that, if sysctl fails for some bizarre
// reason, we get a predictable result.
info.kp_proc.p_flag = 0;
// Initialize mib, which tells sysctl the info we want, in this case
// we're looking for information about a specific process ID.
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();
// Call sysctl.
size = sizeof(info);
junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
assert(junk == 0);
// We're being debugged if the P_TRACED flag is set.
return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
}
再判断当前机型是否为iphoneXs Max
//引入头文件
#import
- (NSString *)getPhoneType{
struct utsname systemInfo;
uname(&systemInfo);
NSString *phoneType = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
if([phoneType isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
if([phoneType isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if([phoneType isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if([phoneType isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
if([phoneType isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
if([phoneType isEqualToString:@"iPhone3,3"]) return @"iPhone 4";
if([phoneType isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if([phoneType isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
if([phoneType isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
if([phoneType isEqualToString:@"iPhone5,3"]) return @"iPhone 5c";
if([phoneType isEqualToString:@"iPhone5,4"]) return @"iPhone 5c";
if([phoneType isEqualToString:@"iPhone6,1"]) return @"iPhone 5s";
if([phoneType isEqualToString:@"iPhone6,2"]) return @"iPhone 5s";
if([phoneType isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if([phoneType isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if([phoneType isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if([phoneType isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
if([phoneType isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
if([phoneType isEqualToString:@"iPhone9,1"]) return @"iPhone 7";
if([phoneType isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
if([phoneType isEqualToString:@"iPhone10,1"]) return @"iPhone 8";
if([phoneType isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
if([phoneType isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus";
if([phoneType isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
if([phoneType isEqualToString:@"iPhone10,3"]) return @"iPhone X";
if([phoneType isEqualToString:@"iPhone10,6"]) return @"iPhone X";
if([phoneType isEqualToString:@"iPhone11,8"]) return @"iPhone XR";
if([phoneType isEqualToString:@"iPhone11,2"]) return @"iPhone XS";
if([phoneType isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max";
if([phoneType isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max";
return @"Unknown Device";
}
最后修改得到的代码如下 以SVP为例:
if (AmIBeingDebugged()){
if ([[self getPhoneType] isEqualToString:@"iPhone XS Max"]){
}else{
[self.hudView addMotionEffect:effectGroup];
}
}else{
[self.hudView addMotionEffect:effectGroup];
}