开发者

Yet another EXC_BAD_ACCESS - However with zombie (instruments), never exe_bad_access

开发者 https://www.devze.com 2023-03-21 06:51 出处:网络
I have spent hours on this and read everybit on the web about memory management, zombies. leaks (tried instruments). But I cannot figure this one out. Does someone has a clue? I am getting a EXC_BAD_A

I have spent hours on this and read everybit on the web about memory management, zombies. leaks (tried instruments). But I cannot figure this one out. Does someone has a clue? I am getting a EXC_BAD_ACCESS at the following like of code on popping the ChildViewController.

[profileVO release]; profileVO = nil;

I strongly feel I have followed all memory management best practices!

Details:

I have a model file. (CachedProfileVO)

CachedProfileVO.h

@interface CachedProfileVO : NSObject {

   NSString *name;
   NSString *email;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *email;

@end

CachedProfileVO.m

@synthesize name, email;
- (void) dealloc
{
    [super dealloc];
    [name release]; name= nil;
    [email release]; email = nil; 
}

Now I have a UINavigationController. The ParentViewController and the ChildViewController. I invoke the ChildViewController as follows:

[self.navigationCntroller pushViewcontroller:childViewcontroller animated:YES];

In the ChildViewController, I basically use the model CachedProfileVO. However when this view controller is popped (back button on UI), it gives a EXC_BAD_ACCESS

ChildViewController.h

@interface ChildViewcontroller : UITableViewController {
    CachedProfileVO *profileVO;  

}

@property (nonatomic, retain) CachedProfileVO *profileVO;
@end

ChildViewController.m

@synthesize profi开发者_如何学CleVO;

- (void) dealloc
{
   [super dealloc];
   [profileVO release]; profileVO = nil; ****** GETTING EXE_BAD_ACCESS here
}

- (void) viewDidLoad
{
 CachedProfileVO *vo = [CachedProfileVO alloc] init];
 self.profileVO = vo;
 [vo release];

}

//responseString looks like this: [Murdoch, murdoch@email.com][other data][more data]
- (void) populateProfile:(NSString *) responseString 
{
  NSMutableString *str = [[NSMutableString alloc] initWithCapacity:20];
  [str setString:responseString];
  [str deleteCharactersInRange: NSMakeRange(0,1)];
  [str deleteCharactersInRange: NSMakeRange([str length]-1,1)];
  NSArray *tempArray = [str componentsSeparatedByString: @"]["];

  NSString *tempStr = (NSString*)[tempArray objectAtIndex:0];
  NSArray *bioArray = [tempStr componentsSeparatedByString:@","];

  self.profileVO.name = (NSString*)[bioArray objectAtIndex:0];
  self.profileVO.email= (NSString*)[bioArray objectAtIndex:1];

  [str release]; str = nil;
}

Note that the function populateProfile is called after some event. I know it is called. And dealloc then causes the problem. Also this does not happen in every pop. I have to try several times to reproduce. It is never reproduced using zombies in instruments!!!


You are calling [super dealloc]; first in your examples. That should always be the last call otherwise you are accessing instance variables that belong to a now deallocated class. The following should work fine if you followed memory management rules elsewhere.

- (void) dealloc
{
   [profileVO release];

   [super dealloc];
}
0

精彩评论

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

关注公众号