【内存管理-问题实例】为什么变量release掉了却还能用。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    if (_refreshHeaderView == nil) {
        
        EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];
        view.delegate = self;
        [self.tableView addSubview:view];
        _refreshHeaderView = view;
        [view release];
        
    }    

    //  update the last update date
    [_refreshHeaderView refreshLastUpdatedDate];

    
}

view release 不是释放掉它所指向的空间了吗,_refreshHeaderView 怎么还能接着用,调用它的方法呢?[_refreshHeaderView refreshLastUpdatedDate];


对应的xcode页面截图

图片:1.jpg



7 楼: 发表于: 03-28    发自: Web Page 

       view.delegate = self;
       [self.tableView addSubview:view];

你这不是还有个[self.tableView addSubview:view];
tableView的addSubView会对view进行retain,所以即使你release view了,
这个view仍可以用.

你可以在[self.tableView addSubview:view];后加上

NSLog(@"view retainCount= %i",[view retainCount]);

这个retainCount应该大于1的。

另外

_refreshHeaderView = view;
这是不好的写法,
如果你要后续使用这个view,建议的做法是
_refreshHeaderView = [view retain];

这样意图更明显,而不是依赖[self.tableView addSubview:view];的这种行为。


http://www.cocoachina.com/bbs/read.php?tid=97998


你可能感兴趣的:(Date,Web,xcode)