iOS - Subview Crashing On Resume

时间:2011-04-21 17:55:18

标签: iphone ipad uiview ios4 uigesturerecognizer

我有几个由导航控制器控制的子视图。其中一个是在简历上崩溃。这是一个通过推进一系列图像和平移手势控制器将模型“旋转”360度(想想地球)的类。

一切顺利,直到我点击那个讨厌的主页按钮。当我按下主页按钮时,直到图像在UIView上设置才崩溃...大部分时间至少。有时它会改变一次并且在第二次改变时崩溃显然只是为了让我的生活更有趣。

任何有关这方面的见解都会很棒。

先谢谢。

//  RotationController.m
//

#import "RotationController.h"

@implementation RotationController

@synthesize myRotationView;
@synthesize imageName;
@synthesize scheme;
int maxFrame;
int currentX;

- (void)viewDidLoad {
    [super viewDidLoad];

    //self.title = @"Cutaway View";

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panPiece:)];
    [myRotationView addGestureRecognizer:panGesture];
    [panGesture release];
}

-(void)setup:(int) currentNode{

    if (currentNode <= 2)
    {
        currentX = 0;
        maxFrame = 199;
        scheme = @"Trailer1Rotation_";
        self.title = @"Trailer One Cutaway View";
        [self.myRotationView setImage:[UIImage imageNamed:@"Trailer1Rotation_000.jpg"]];
    }
    else if (currentNode > 2 && currentNode <= 5)
    {
        currentX = 0;
        maxFrame = 199;
        scheme = @"spinTrailer2_00";
        self.title = @"Trailer Two Cutaway View";
        [self.myRotationView setImage:[UIImage imageNamed:@"spinTrailer2_00000.jpg"]];
    }
    else if (currentNode > 5 && currentNode <= 8)
    {
        currentX = 0;
        maxFrame = 199;
        scheme = @"spinTrailer3_00";
        self.title = @"Trailer Three Cutaway View";
        [self.myRotationView setImage:[UIImage imageNamed:@"spinTrailer3_00000.jpg"]];
    }
    else if (currentNode > 8)
    {
        currentX = 0;
        maxFrame = 199;
        scheme = @"spinTrailer4_00";
        self.title = @"Trailer Four Cutaway View";
        [self.myRotationView setImage:[UIImage imageNamed:@"spinTrailer4_00000.jpg"]];
    }
}

-(void)viewWillAppear:(BOOL)animated {

    self.myRotationView.userInteractionEnabled = YES;
}

-(void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"Test - DidEnterBackGround");
}

-(void)applicationWillResignActive
{
    NSLog(@"Test - WillResignActive");
}

- (void)applicationDidBecomeActive
{
    NSLog(@"Test - DidBecomeActive");

    [self.myRotationView setImage:[UIImage imageNamed:@"Trailer1Rotation_000.jpg"]];
}

-(void)panPiece:(UIPanGestureRecognizer *) gesture{

    switch(gesture.state) {
        case UIGestureRecognizerStateChanged: {
            //CGPoint center = gesture.view.center;
            CGPoint translation = [gesture translationInView:gesture.view];

//          center = CGPointMake((center.x + translation.x),
//                               (center.y + translation.y));
//          gesture.view.center = center;
//          [gesture setTranslation:CGPointZero inView:gesture.view];

            NSLog(@"Changed");
            NSLog(@"%f", translation.x);
            NSLog(@"%f", translation.y);

            int changeX = (int)translation.x / 20;

            if (changeX == 0)
                changeX = 1;

            currentX = (int)currentX + (int)changeX;

            while (currentX > 174) {
                currentX = currentX - 174;
            }

            while (currentX < 0) {
                currentX = currentX + 174;
            }

            if (currentX < 10) {
                imageName = [NSString stringWithFormat:@"%@00%i.jpg", scheme, currentX];
                NSLog(@"%@", imageName);
            } else if (currentX < 100) {
                imageName = [NSString stringWithFormat:@"%@0%i.jpg", scheme, currentX];
                NSLog(@"%@", imageName);
            } else {
                imageName = [NSString stringWithFormat:@"%@%i.jpg", scheme, currentX];
                NSLog(@"%@", imageName);
            }

            //NSLog(@"%@", myRotationView.image);
            [self.myRotationView setImage:[[UIImage imageNamed:imageName]autorelease]];
            //NSLog(@"%@", myRotationView.image);
        }
        case UIGestureRecognizerStateBegan: {
            [gesture setTranslation:CGPointZero inView:gesture.view];

            NSLog(@"Began");

            break;
        }
        case UIGestureRecognizerStateEnded: {
            //CGPoint velocity = [gesture velocityInView:self.view];
            //The user lifted their fingers. Optionally use the velocity to contain rotating the globe automatically

            NSLog(@"Ended");

            break;
        }
        default: {
            //Something else happened. Do any cleanup you need to.
            NSLog(@"Something else happened.");
        }
    }
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code.
}
*/

- (void)dealloc {
    [super dealloc];


    NSLog(@"Rotation Controller - DeAlloc");
    [myRotationView release];
    [scheme release];
    [imageName release];
}

@end

回溯:

2011-04-21 14:38:39.442 MCIT[52259:207] Test - DidBecomeActive
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) backtrace
#0  0x01326a78 in objc_msgSend ()
#1  0x0633d540 in ?? ()
#2  0x000138b2 in -[RotationController applicationDidBecomeActive] (self=0x6607dc0, _cmd=0x17540) at /Users/jacob/Documents/iOS Dev/MCIT/Classes/RotationController.m:83
#3  0x00002a1c in -[MCITAppDelegate applicationDidBecomeActive:] (self=0x6603f30, _cmd=0x6e25a7, application=0x6300700) at /Users/jacob/Documents/iOS Dev/MCIT/Classes/MCITAppDelegate.m:100
#4  0x002d2542 in -[UIApplication _setActivated:] ()
#5  0x002dfe18 in -[UIApplication _handleApplicationResumeEvent:] ()
#6  0x002df7d4 in -[UIApplication handleEvent:withNewEvent:] ()
#7  0x002d7202 in -[UIApplication sendEvent:] ()
#8  0x002dc732 in _UIApplicationHandleEvent ()
#9  0x01afaa36 in PurpleEventCallback ()
#10 0x01afaabd in PurpleEventSignalCallback ()
#11 0x011a601f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
#12 0x0110428b in __CFRunLoopDoSources0 ()
#13 0x01103786 in __CFRunLoopRun ()
#14 0x01103240 in CFRunLoopRunSpecific ()
#15 0x01103161 in CFRunLoopRunInMode ()
#16 0x01af9268 in GSEventRunModal ()
#17 0x01af932d in GSEventRun ()
#18 0x002e042e in UIApplicationMain ()
#19 0x00001f0e in main (argc=1, argv=0xbffff070) at /Users/jacob/Documents/iOS Dev/MCIT/main.m:14

它在我的测试代码中没有想到......当图像设置完毕时。

- (void)applicationDidBecomeActive
{
    NSLog(@"Test - DidBecomeActive");

    [self.myRotationView setImage:[UIImage imageNamed:@"Trailer1Rotation_000.jpg"]];
}

2 个答案:

答案 0 :(得分:1)

我发现调试这些问题的最简单方法是为您的可执行文件打开NSZombieEnabled。

在Xcode中展开项目的'Executable'项,双击它。现在点击左下方的加号('+')图标,添加一个值为NSZombieEnabled的{​​{1}}变量。

您应该只在开发过程中使用此设置,否则您的应用无法正常释放内存。您不希望在启用此设置的情况下尝试投放您的应用。

我通过在UIApplicationDelegate类中添加一些测试代码来检查这一点:

YES

答案 1 :(得分:0)

首先,改变你的dealloc方法

[super dealloc]

是最后一行,而不是第一行。它应该是你在dealloc中做的最后一件事。

myRotationView是否在Nib中创建?你是在viewDidUnload中发布它吗?

最后,整个堆栈跟踪将告诉我们EXC_BAD_ACCESS发生在哪一行。