Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone:SIGSEGV在设备上似乎是随机出现的(ViewDidLoad、setFont等),从未在模拟器中出现过_Iphone_Objective C_Ios_Uiviewcontroller_Exc Bad Access - Fatal编程技术网

iPhone:SIGSEGV在设备上似乎是随机出现的(ViewDidLoad、setFont等),从未在模拟器中出现过

iPhone:SIGSEGV在设备上似乎是随机出现的(ViewDidLoad、setFont等),从未在模拟器中出现过,iphone,objective-c,ios,uiviewcontroller,exc-bad-access,Iphone,Objective C,Ios,Uiviewcontroller,Exc Bad Access,首先,提前感谢您花时间通读本文。几天来我一直在寻找这个问题的答案,但我似乎找不到我想要的。我知道SIGSEGV错误(或EXEC_BAD_访问错误)通常是由内存管理问题引起的,但在查看代码数小时后,我似乎找不到错误。静态分析器也没有发现任何东西 正如标题所说,这个错误只发生在设备上(在模拟器中永远不会发生),并且不是每次加载给定的视图时都会发生。显然,这意味着我不能使用NSZombie来调试出了什么问题 让我们从崩溃转储日志开始: 0 myApp 0x00036659 +[TFCrashHandl

首先,提前感谢您花时间通读本文。几天来我一直在寻找这个问题的答案,但我似乎找不到我想要的。我知道SIGSEGV错误(或EXEC_BAD_访问错误)通常是由内存管理问题引起的,但在查看代码数小时后,我似乎找不到错误。静态分析器也没有发现任何东西

正如标题所说,这个错误只发生在设备上(在模拟器中永远不会发生),并且不是每次加载给定的视图时都会发生。显然,这意味着我不能使用NSZombie来调试出了什么问题

让我们从崩溃转储日志开始:

0 myApp 0x00036659 +[TFCrashHandler backtrace] + 428
1 myApp 0x00036a6f TFSignalHandler + 54
2 libsystem_c.dylib 0x32f48539 _sigtramp + 48
3 UIKit 0x365701df -[UIView(Rendering) setNeedsDisplay] + 86
4 UIKit 0x36598269 -[UILabel setFont:] + 232
5 myApp 0x000190eb +[BruUISettings applyLabelDetailStyle:] (BruUISettings.m:130)
6 myApp 0x0001aa57 -[ActiveChallengeViewController viewDidLoad] (ActiveChallengeViewController.m:115)
7 UIKit 0x365a57ff -[UIViewController view] + 166
8 UIKit 0x365b1c39 -[UIViewController contentScrollView] + 24
9 UIKit 0x365b1aa9 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 36
10 UIKit 0x365b198f -[UINavigationController _layoutViewController:] + 34
11 UIKit 0x365b115b -[UINavigationController _startTransition:fromViewController:toViewController:] + 318
12 UIKit 0x365b0f53 -[UINavigationController _startDeferredTransitionIfNeeded] + 250
13 UIKit 0x365a5673 -[UINavigationController pushViewController:transition:forceImmediate:] + 806
14 UIKit 0x365a5349 -[UINavigationController pushViewController:animated:] + 36
15 myApp 0x00015dc7 -[ChallengesHomeViewController tableView:didSelectRowAtIndexPath:] (ChallengesHomeViewController.m:325)
16 UIKit 0x3661f565 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 944
17 UIKit 0x36697ce7 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 158
18 Foundation 0x31f7a943 __NSFireDelayedPerform + 414
19 CoreFoundation 0x34ab1a63 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14
20 CoreFoundation 0x34ab16c9 __CFRunLoopDoTimer + 364
21 CoreFoundation 0x34ab029f __CFRunLoopRun + 1206
22 CoreFoundation 0x34a334dd CFRunLoopRunSpecific + 300
23 CoreFoundation 0x34a333a5 CFRunLoopRunInMode + 104
24 GraphicsServices 0x351a7fed GSEventRunModal + 156
25 UIKit 0x3659a743 UIApplicationMain + 1090
26 myApp 0x000026c5 main (main.m:13)
27 myApp 0x0000265c start + 52
注意,我使用的是testflightapp.com中的TestFlight,堆栈顶部有异常处理程序

以下是创建和推送相关视图控制器的代码:

CDAcceptedChallenge *challengeAtIndex = [self.activeChallenges objectAtIndex:[indexPath row]];
ActiveChallengeViewController *view = [[ActiveChallengeViewController alloc] initWithNibName:@"ActiveChallengeViewController" 
                                                                                      bundle:nil 
                                                                             activeChallenge:challengeAtIndex];
view.leaveChallengeTarget = self;

[self.navigationController pushViewController:view animated:YES];
[view release];
这段代码在didselectrowatinex方法中运行,如果这很重要的话。此视图控制器有一组成员变量和IBOutlet,它们引用nib中的对象,但以下是与此错误中提到的对象相关的变量和IBOutlet:

在h中:

UILabel *helpLabel;
...
@property (nonatomic, retain) IBOutlet UILabel *helpLabel;
in.m:

@synthesize helpLabel;
我确信helpLabel绑定到nib中的正确对象,因为它在没有爆炸的情况下得到了正确的样式。接下来,这里是该视图控制器的init方法:

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) 
{
    self.activeChallenge = inActiveChallenge;
}
return self;
这里是viewDidLoad方法,我们有时会看到崩溃(粗体)。请注意,这里发生了很多事情,但是没有任何事情涉及self.helpLabel,这是最终触发崩溃的原因

[super viewDidLoad];
[self.navigationController setNavigationBarHidden:FALSE];
self.navigationItem.title = @"Details";

// overlay disclosure creation
self.overlayDisclosure = [CustomColoredDisclosureIndicator accessoryWithColor:self.challengeNameLabel.textColor];
self.overlayDisclosure.highlightedColor = [UIColor whiteColor];
[self.overlayDisclosure addTarget:self action:@selector(overlayViewButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.overlayDisclosure];

[[BruNotificationManager instance] registerForTabUpdated:[[[BruCallback alloc] initWithTarget:self 
                                                                                 andCallback:@selector(tabUpdated:)] autorelease]];
[[BruNotificationManager instance] registerForActiveChallengesUpdated:[BruCallback buildFromObject:self 
                                                                                       andCallback:@selector(challengesUpdatedLocally)]];
[[BruNotificationManager instance] registerForEarnedRewardsUpdated:[BruCallback buildFromObject:self 
                                                                                    andCallback:@selector(rewardsUpdatedLocally:)]];

[super refreshEarnedRewardsForChallenge:self.activeChallenge.challenge.identifier];
[super refreshTabForChallenge:self.activeChallenge.challenge.identifier];

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                                                                           target:self 
                                                                           action:@selector(addBeer)];
self.navigationItem.rightBarButtonItem = addButton;
[addButton release];

// Request that the object download its image
BruCallback *imageCallback = [BruCallback buildFromObject:self andCallback:@selector(imageRequestCompleted:withData:)];
self.challengeImageView.image = [self.activeChallenge.challenge retrieveImage:self.bruConnection withCallback:imageCallback];

// Create our help label
**[BruUISettings applyLabelDetailStyle:self.helpLabel];**
self.helpLabel.textColor = AccentSecondaryColor;

self.overlayView.alpha = [BruUISettings standardOverlayViewAlpha];

[BruUISettings applyTableStyle:self.rewardsTable];
[BruUISettings applyScrollViewStyle:self.scrollView];

self.needToUpdateTab = YES;
self.needToUpdateRewards = YES;
self.needToUpdateChallenge = NO;
下面是viewDidUnload方法的精简版本,但我不明白为什么在这种情况下它会起作用:

...
self.helpLabel = nil;
...

[super viewDidUnload];
最后,我的[BruUISettings applyLabelDetailStyle]是一种将集中式样式应用于我的标签的方法。在我的代码中有很多地方使用了这个函数,因此我可以通过只更改一个函数来更改这些标签的所有样式

+ (void) applyLabelDetailStyle:(UILabel *)inLabel
{
    inLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:12.0];
    inLabel.textColor = [UIColor darkGrayColor];
    inLabel.backgroundColor = [UIColor clearColor];
}

任何关于这里可能发生的事情的想法都将不胜感激。再次感谢。

我认为出现问题是因为您的标签视图(ActiveChallengeViewController视图)中存在错误

当您设置标签的字体时,会调用父视图的setNeedsDisplay,并且由于出现问题,setNeedsDisplay会崩溃

您的线路:

self.challengeImageView.image = [self.activeChallenge.challenge retrieveImage:self.bruConnection withCallback:imageCallback];
它是检索图像的同步连接吗

当有时无法从您的连接中检索图像,因此图像视图的图像属性不好时,可能会出现问题

但是我不确定,因为setNeedsDisplay不会直接调用视图的重画,所以我不知道调试器是否在setNeedsDisplay调用之后捕捉到错误

编辑:


我觉得这个答案不好,如果图像不好,当imageView image属性保留图像时,一定会发生崩溃,但我让它的答案可以帮助您指出真正的问题。

经过大量调试后,我发现这实际上是由于用于生成base64编码字符串的QSStrings库导致的内存损坏。崩溃似乎是随机发生的,但只有在调用此库之后才会发生。当我切换到另一个MD5库时,问题就消失了。如果您正在使用这个库,我建议您找到一个新库来进行base64编码。我转到这里找到的一个:

问题是否是您在设备上收到大量内存警告(因此解除
视图的分配),而不是在模拟器中?尝试在模拟器中设置一些内存警告,看看你是否也遇到了问题。感谢克里斯托弗的评论。我在模拟器中模拟了内存警告,但没有产生这个错误。我同意这可能与内存警告有关,但我不明白它们如何影响ViewDidLoad中的我。不管内存警告如何,在ViewDidLoad中,所讨论的标签似乎都保证在内存中。这不是一个安全的假设吗?如果此视图不在前台,并且您收到内存警告,则可能会在下次显示(和加载)视图时处理并重新创建它。或者,当显示此特定视图时,是否总是发生错误?您可能知道,您应该始终确保平衡
viewDidLoad
viewDidUnload
中的任何操作,否则您可能会处于损坏状态。。。。但是如果您只是在
viewDidLoad
中得到错误(并且从未从其他地方调用过),那么if可能不是问题所在。但这是我要检查的第一个地方。另外,你确定
文本标签在你代码的其他地方没有发布吗?我想你可以
applyLabelDetailStyle:
中保留它,而你正在对它施展魔法(尽管这不太可能有帮助,因为如果它被解除分配,它不会显示在任何地方)。谢谢你提供的信息。一个问题是,setNeedsDisplay调用是针对标签所在的父视图,还是针对标签本身?我假设它是标签,但如果它是视图,则可能表明视图而不是标签有问题。通常,setNeedsDisplay调用必须在标签中,而不是在父视图中,但我不确定,我不知道它是如何在内部处理的。尝试注释掉self.challengeImageView.image=。。。行并测试是否再次发生崩溃可以确认我在同一个库中有相同的问题。我真希望我能早点找到这篇文章,那是一个艰难的调试。