簡體   English   中英

Objective-C屬性釋放錯誤

[英]Objective-C property release error

是什么原因導致此崩潰? 從我閱讀的所有內容中,我正在正確使用該屬性。 當我第一次調用loadDot2Dot方法時,它可以正常工作。 然后,當我返回主菜單(調用loadMainMenu)並嘗試再次加載dot2DotVC(再次調用loadDot2DotVC)時,出現崩潰(Exc_Bad_Access)-沒有更多信息。

當我注釋掉[d2d版本]時; 在loadDot2Dot行它工作正常。 難道我做錯了什么? 我知道我應該在那里釋放...

干杯,

這是.h

#import <UIKit/UIKit.h>

@class MenuVC;
@class Dot2DotVC;

@interface MyViewController : UIViewController {

    UIViewController *menuVC;           
    UIViewController *dot2DotVC;        

}
@property (nonatomic, retain) UIViewController *menuVC;
@property (nonatomic, retain) UIViewController *dot2DotVC;


- (IBAction)loadMainMenu:(id)sender;   
- (IBAction)loadDot2Dot:(id)sender;   


@end

這是.m

#import "MyViewController.h"
#import "MenuVC.h"
#import "Dot2DotVC.h"

@implementation MyViewController

@synthesize dot2DotVC;
@synthesize menuVC;

- (IBAction)loadMainMenu:(id)sender {

    if(self.menuVC != nil){
        [self.menuVC.view removeFromSuperview];
    }   

    MenuVC *menuController = [[MenuVC alloc] initWithNibName:@"iPadMenuVC" bundle:nil];
    self.menuVC = menuController;
    [menuController release];


    [self.view insertSubview:self.menuVC.view atIndex:0];   
    if (self.dot2DotVC != nil) {
        [self.dot2DotVC.view removeFromSuperview];
    }   
}

- (IBAction)loadDot2Dot:(id)sender {

    Dot2DotVC *dvc = [[Dot2DotVC alloc] initWithNibName:@"iPadDot2DotVC" bundle:nil];
    self.dot2DotVC = dvc;

    [dvc release]; // If I comment out this release call, I don't get a crash.   

    [self.view insertSubview:dot2DotVC.view atIndex:0]; 
    if (self.menuVC != nil) {
        [self.menuVC.view removeFromSuperview];
    }
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    MenuVC *menuController = [[MenuVC alloc] initWithNibName:@"iPadMenuVC" bundle:nil];     
    self.menuVC = menuController;
    [menuController release];

    [self.view insertSubview:self.menuVC.view atIndex:0];       
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];    
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;    
}


- (void)dealloc {   

    self.menuVC = nil;      
    self.dot2DotVC = nil;   
    [super dealloc];    
}

-(BOOL)canBecomeFirstResponder {
    return YES;
}

-(void)viewDidAppear:(BOOL)animated {

    [self becomeFirstResponder];
}

@end

ator / Documents / Princess_Pets / main.m:14

Program received signal:  “EXC_BAD_ACCESS”. (gdb) bt
#0  0x30fb15fa in objc_msgSend ()
#1  0x314b9aca in CFRelease ()
#2  0x31525b58 in __CFTypeCollectionRelease ()
#3  0x31503522 in __CFArrayReleaseValues ()
#4  0x315038a2 in __CFArrayDeallocate ()
#5  0x314b9bc0 in _CFRelease ()
#6  0x314b9a9a in CFRelease ()
#7  0x30338038 in -[NSCFArray release] ()
#8  0x30fb29e8 in objc_setProperty ()
#9  0x0000f246 in -[Dot2DotVC setCurrentImages:] (self=0x13a310,
_cmd=0x19a8c, newArray=0x0) at /Users/adminstrator/Documents/Princess_Pets/Classes/Dot2DotVC.m:42
#10 0x0000ec36 in -[Dot2DotVC dealloc] (self=0x13a310, _cmd=0x33005660) at /Users/adminstrator/Documents/Princess_Pets/Classes/Dot2DotVC.m:1474
#11 0x314ba71a in -[NSObject release] ()
#12 0x30fb29e8 in objc_setProperty ()
#13 0x00004452 in -[Princess_PetsViewController setDot2DotVC:] (self=0x11d800,
_cmd=0x194f9, _value=0x145100) at /Users/adminstrator/Documents/Princess_Pets/Classes/Princess_PetsViewController.m:20
#14 0x00003234 in -[Princess_PetsViewController loadDot2Dot:] (self=0x11d800,
_cmd=0x1962e, sender=0x146840) at /Users/adminstrator/Documents/Princess_Pets/Classes/Princess_PetsViewController.m:107
#15 0x314db16c in -[NSObject performSelector:withObject:withObject:] ()
#16 0x322930d4 in -[UIApplication sendAction:to:from:forEvent:] ()
#17 0x32293074 in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
#18 0x32293046 in -[UIControl sendAction:to:forEvent:] ()
#19 0x32292d98 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#20 0x322933e6 in -[UIControl touchesEnded:withEvent:] ()
#21 0x32291dbc in -[UIWindow _sendTouchesForEvent:] ()
#22 0x32291704 in -[UIWindow sendEvent:] ()
#23 0x3228d326 in -[UIApplication sendEvent:] ()
#24 0x3228cc92 in _UIApplicationHandleEvent ()
#25 0x3414eb32 in PurpleEventCallback ()
#26 0x314d8d9c in CFRunLoopRunSpecific ()
#27 0x314d84e0 in CFRunLoopRunInMode ()
#28 0x3414e0da in GSEventRunModal ()
#29 0x3414e186 in GSEventRun ()
#30 0x32241430 in -[UIApplication _run] ()
#31 0x3223f95a in UIApplicationMain ()
#32 0x00002852 in main (argc=1, argv=0x2ffff60c) at /Users/adminstrator/Documents/Princess_Pets/main.m:14ator/Documents/Princess_Pets/main.m:14

從回溯來看,您的問題似乎直接在Dot2DotVC中。 在其-dealloc中,它在self上調用-setCurrentImages:會釋放舊值,該舊值似乎包含垃圾對象。 換句話說,在視圖控制器上調用-dealloc時,Dot2DotVC上的數組屬性currentImages至少包含一個無效對象。

作為附帶說明,我強烈建議您不要在-dealloc中使用屬性訪問。 您在問題中列出的-dealloc最好是:

- (void)dealloc {
    [menuVC release];
    [dot2DotVC release];
    [super dealloc];
}

這樣可以避免設置員或KVO觀察員揮之不去的任何潛在問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM