开发者

release view controller and removing view

Quick question:

If I use

[someViewController.view addSubView:otherViewController.view];

to add a view. And then use

[otherViewController.view removeFromSuperView] 

to remove the view, my app will crash when I call [otherViewController release]

The crash point is in the [super dealloc] line in my dealloc method of otherViewControll class implementation.

otherViewController is a reference to the view controller. I call release after its view has been removeFromSuperView'ed. By the time I call release, it's a valid pointer.

What am I doing wrong here?

otherViewController's dealloc class implementation

- (void)dealloc {
    [popVC release];
    [photoContainer release];
    [photoView release];
    [recordName release];
    [recordIngr release];
    [recordDesc release];
    [recordPrice release];
    [quantity release];
    [pricingLabel release];
    [increaseButton release];
    [decreaseButton release];

    [pricingTableVC release];
    [pricingTable release];

    [super dealloc];   // <--- crash point
}

updated: call trace

2011-06-04 00:35:05.110 MyApp[2308:207] -[__NSCFType _viewDelegate]: unrecognized selector sent to instance 0x4b6feb0
2011-06-04 00:35:05.124 MyApp[2308:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType _viewDelegate]: unrecognized selector sent to instance 0x4b6feb0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00dd75a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x00f2b313 objc_exception_throw + 44
    2   CoreFoundation                      0x00dd90bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x00d48966 ___forwarding___ + 966
    4   CoreFoundation                      0x00d48522 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x00379051 -[UIViewController dealloc] + 128
    6   MyApp                              0x00009b26 -[RecordDetailViewController dealloc] + 797
    7   MyApp                              0x00004744 __-[RecordRootViewController bringUpNextRecordDetail:isNext:]_block_invoke_2 + 77
    8   UIKit                               0x002f7fb9 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 294
    9   UIKit                               0x002f7e4b -[UIViewAnimationState animationDidStop:finished:] + 77
    10  QuartzCore                          0x01d7b99b _ZL23run_animation_callbacksdPv + 278
    11  QuartzCore                          0x01d20651 _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv + 157
    12  CoreFoundation                      0x00db88c3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
    13  CoreFoundation                      0x00db9e74 __CFRunLoopDoTimer + 1220
    14  Core开发者_运维技巧Foundation                      0x00d162c9 __CFRunLoopRun + 1817
    15  CoreFoundation                      0x00d15840 CFRunLoopRunSpecific + 208
    16  CoreFoundation                      0x00d15761 CFRunLoopRunInMode + 97
    17  GraphicsServices                    0x0172e1c4 GSEventRunModal + 217
    18  GraphicsServices                    0x0172e289 GSEventRun + 115
    19  UIKit                               0x002d5c93 UIApplicationMain + 1160
    20  MyApp                              0x0000200c main + 102
    21  MyApp                              0x00001f9d start + 53
)
terminate called after throwing an instance of 'NSException'

Update: in -viewDidLoad, I have a gesture recognizer:

{
    UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(showNextRecod:)];
    [leftSwipeGestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [self.view addGestureRecognizer:leftSwipeGestureRecognizer];
    [leftSwipeGestureRecognizer release];

}

I tried to use a Button to call -(IBAction) showNextRecod, it won't crash!! Only when I use the gesture to call the same method, it would crash

Regards

Leo


When you add a view controller's view as a subview to another view, you are only retaining it's view in memory and not the controller itself. Therefore, you must retain the view controller somewhere else (most likely make it a property)

Does that make sense?


In your gesture selector showNextRecod:
you should remove your target [pGestureRecognizer removeTarget:nil action:NULL];


@leo You are just adding otherViewController.view in someViewController.view.

Just adding view not allocating it, then just remove it from your view.

Im not getting why you are using [otherViewController release] when you are not allocating it same view.

For sure you can log otherViewController.view count. See how much retain count for that view you are getting.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜