过度释放与否?

时间:2011-04-30 08:19:45

标签: iphone objective-c

对不起我是新手。这是否超过释放OverlayviewController?因为它是自动释放并在dealloc再次释放。或者没关系?谢谢你帮忙。

@implementation ViewController

@synthesize imageView, overlayViewController, cameraBtn;


#pragma mark -
#pragma mark View Controller

- (void)viewDidLoad

{
    [super viewDidLoad];

// Sharekit Logout button
    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:SHKLocalizedString(@"Logout") style:UIBarButtonItemStyleBordered target:self action:@selector(logout)] autorelease];

    self.overlayViewController =
    [[[OverlayViewController alloc] initWithNibName:@"OverlayViewController" bundle:nil] autorelease];

// as a delegate we will be notified when pictures are taken and when to dismiss the image picker
    self.overlayViewController.delegate = self;
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        cameraBtn.hidden = YES;
    }
}


-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

- (void)viewDidUnload
{
    self.imageView = nil;
    self.overlayViewController = nil;
}

- (void)dealloc
{   
    [imageView release];
    [overlayViewController release];
    [super dealloc];
}

1 个答案:

答案 0 :(得分:0)

缺少的一部分是属性overlayViewController的定义。如果它有retain选项,那么一切都很好。

在你的viewDidLoad,你的分配然后自动释放,所以这是平衡的。但是你也将它分配给属性 overlayViewController,如果它有retain选项(在这种情况下它应该),那么你的调用将保留分配的OverlayViewController。这正是你想要的。

dealloc中,您将发布支持该属性的变量。这是正确的,您的控制器将正确释放。但是,它会更早发布:在viewDidUnload中,您将nil分配给该属性。这将释放控制器。因此,当调用dealloc时,overlayViewController变量很可能是nil(但它也可能仍包含控制器,具体取决于对象的使用方式,即取决于{{1}是否被调用。

因此,如果属性viewDidUnload具有overlayViewController选项,则此处显示的代码是正确的