【发布时间】:2017-04-08 07:57:06
【问题描述】:
当我将我的应用程序测试为 DEBUG 时,它就可以工作了。但是当我发布到 App Store 并从 App Store 安装应用程序时,它会崩溃。
因此我将DEBUG RUN 方法改为RELEASE 运行方法进行测试。
当我现在以 RELEASE 运行方法运行时,应用程序也会崩溃(与应用商店崩溃相同)。应用程序崩溃指向第 19 行。
我该如何解决?在这里,我告诉我通过将一个字符串与我从第 18 行获得的字符串连接来制作 DNS(A 或 AAAA 记录)self.server = [self.server stringByAppendingString:@".example.com"];。
- (void)myMethodHere:(NSString *)a {
//where a = @"splitme://test1/test2/test3";
NSArray *work_array = [a componentsSeparatedByString:@"splitme://"];
self.use_url =[work_array objectAtIndex:1];
if ([self.use_url length] > 0) {
NSArray *work_array = [self.use_url componentsSeparatedByString:@"/"];
self.server = [work_array objectAtIndex:0];
// -------------------
// CRASH HERE // CRASH HERE
// -------------------
if([self.server length] > 0) {
NSLog(@"!!!!!!!!!!!!!!!!!!!!!! 4 - part 1: %@", self.server); // WORKS
// Here we go CRASHing...
self.server = [self.server stringByAppendingString:@".example.com"];
NSLog(@"!!!!!!!!!!!!!!!!!!!!!! 4 - part 2: %@", self.server); // CRASH CRASH
}
else {
self.server = @"test.example.com";
}
}
else {
NSLog(@"!!!!!!!!!!!!!!!!!!!!!! 9: %@", self.use_url);
}
[self load_later];
}
编辑 1: 以下做法让我通过,但如果我在此范围之外再次拥有 self.server,则应用程序再次崩溃。
NSString *part1 = self.server;
NSString *part2 = @".example.com";
NSString *result =[part1 stringByAppendingString:part2];
self.server = result;
NSLog(@"!!!!!!!!!!!!!!!!!!!!!! 4 - part 2: %@", self.server);
编辑 2:在注释掉 NSLog 行后,在 AppDelegate.m 上崩溃。
2017-04-08 10:32:01.773648+0200 app[344:18271] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2017-04-08 10:32:01.774146+0200 app[344:18271] [MC] Reading from public effective user settings.
2017-04-08 10:32:01.778647+0200 app[344:18271] -[__NSArrayM length]: unrecognized selector sent to instance 0x1740457c0
2017-04-08 10:32:01.778888+0200 app[344:18271] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM length]: unrecognized selector sent to instance 0x1740457c0'
*** First throw call stack:
(0x18a956fd8 0x1893b8538 0x18a95def4 0x18a95af4c 0x18a856d2c 0x100006f78 0x1000076e8 0x1000066cc 0x190a85f9c 0x190a85b78 0x190a8c3f8 0x190a89894 0x190afb2fc 0x190d038b4 0x190d092a8 0x190d1dde0 0x190d0653c 0x18c4ff884 0x18c4ff6f0 0x18c4ffaa0 0x18a905424 0x18a904d94 0x18a9029a0 0x18a832d94 0x190af045c 0x190aeb130 0x100007d78 0x18984159c)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
编辑 3: 即使使用显式强制转换,也会导致 NSString 崩溃而不是 NSString
- (void)setServer:(NSString *)value
{
if (value != nil && ![value isKindOfClass:[NSString class]]) {
NSLog(@"!!!!!!!!!!!lol!!!!!!!!!!!!! Bug! Set breakpoint here!");
}
self.server = value;
}
NSArray *work_array = [self.use_url componentsSeparatedByString:@"/"];
NSString *setServerURL =(NSString *) [work_array objectAtIndex:0];
[self setServer:setServerURL];
编辑 4: 崩溃
- (void)myMethodHere:(NSString *)a {
NSArray *work_array = [a componentsSeparatedByString:@"test://"];
id objectOne = [work_array objectAtIndex:1];
if ([objectOne isKindOfClass:[NSString class] ] ) {
NSString *objectOneIntoString = objectOne;
self.use_url = (NSString *) objectOneIntoString;
}
if ([self.use_url length] > 0) {
NSLog(@"3: %@", self.use_url);
NSArray *work_array = [self.use_url componentsSeparatedByString:@"/"];
id objectTwo = [work_array objectAtIndex:0];
if ([objectTwo isKindOfClass:[NSString class] ]) {
NSString *objectTwoIntoString = objectTwo;
self.server = objectTwoIntoString;
}
if([self.server length] > 0) {
NSLog(@"4 - part 1: %@", self.server);
NSString *part1 = self.server;
NSString *part2 = @".example.com";
NSString *result = (NSString *) [part1 stringByAppendingString:part2];
self.server = result;
NSLog(@"4 - part 2: %@", self.server);
}
else {
self.server = @"dns.example.com";
NSLog(@"5:%@", self.server);
}
NSLog(@"8: %@", self.server);
}
else {
NSLog(@"9: %@", self.use_url);
}
NSLog(@"10: %@", self.use_url);
}
【问题讨论】:
-
崩溃日志或调试器中的错误消息是什么?
-
先生,当我删除 NSLog 的那一行时,当我将它作为 RELEASE 方法运行时它也会崩溃,但当我作为 DEBUG 方法运行它时它可以工作。请在此处查看 Xcode 中的崩溃输出:paste.ubuntu.com/24339339
-
在注释掉 NSLog 的行后,我在 AppDelegate.m 中有崩溃指示,请参阅我上面的编辑。
-
先生,当我使用删除
NSString *part1 = self.server; NSString *part2 = @".example.com"; NSString *result =[part1 stringByAppendingString:part2]; self.server = result; NSLog(@"!!!!!!!!!!!!!!!!!!!!!! 4 - part 2: %@", self.server);的所有代码时,我的构建工作。先生,这是iOS本身的BUG吗? -
我想这可能对你有帮助
#define excitedLog(string) NSLog(@"!!!!!!!!!!!!! %@", string)
标签: ios objective-c xcode ipad