如何找到对象正在释放的位置

Posted

技术标签:

【中文标题】如何找到对象正在释放的位置【英文标题】:How to find where object is deallocating 【发布时间】:2016-12-31 10:42:52 【问题描述】:

我只在 ios8 中遇到此错误,在 iOS9 中工作正常

[DetailView respondsToSelector:]: message sent to deallocated instance 0x7c818a20

我有什么方法可以找到我的对象正在取消分配的位置吗?

我知道xcode中有工具zoombie,但它只提供上述信息,我也尝试过分析但没有任何帮助。

我也放置了异常断点,但控制没有在代码中的任何地方中断。

见附图

在我的 MainVC.m 中设置一个属性 @property (nonatomic,strong) DetailView *d;

单击 MainVC.m 中的按钮(我必须将此详细视图添加为子视图)

_d = [[DetailView alloc]initWithData:dict andImgId:[[_arrayHotelimg objectAtIndex:0] valueForKey:@"img_id"] isTour:NO];
_d.dictData = [_dbObj getHotelDescriptionDataFromHid:_iTabId];
_d.delegate = self;
[self.view addSubview:_d];

DetailView.m

-(id)initWithData:(NSDictionary*)dict andImgId:(NSString*)imgId isTour:(BOOL)isTour
    self = [super initWithFrame:CGRectMake(0, TOP, SCREEN_WIDTH, SCREEN_HEIGHT)];
    if (self)
    
    self.arrGalleryImages = [NSMutableArray new];
    _dbObj = [Database Connetion];

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"DetailView" owner:self options:nil];
    self = [subviewArray objectAtIndex:0];
    self.frame = CGRectMake(0, TOP, SCREEN_WIDTH, SCREEN_HEIGHT);
    
    return self;

任何人都可以帮助我了解如何找到正在破坏的代码或对象释放的位置吗?

为什么它在 iOS9 上运行而不在 iOS8 上运行?

【问题讨论】:

你添加了“AllExeption断点”吗? 是的,但代码控制不会在任何地方中断。查看我更新的帖子 我现在帮你。导航到下一个视图控制器时遇到同样的问题,或者在某些地方显示类似的错误。首先显示你的导航编码。 http://***.com/questions/11170614/viewcontroller-respondstoselector-message-sent-to-deallocated-instance-crash/11171042#11171042 【参考方案1】:

在您的类实现中添加方法-dealloc() 并在其中放置断点。然后你就会知道你的对象何时被释放。

【讨论】:

是的,dealloc 中的控制权正在进行中.. 但我怎样才能找到更多信息 不,-dealloc() 每次都会在您的 VC 解除分配时为任何视图控制器调用。这是不同的事情! @KetanParmar -dealloc() 不是 VC 方法,它是 NSObject 上的方法。它有什么不同?根据苹果文档,dealloc 调用对象来释放分配的内存。 是的,但是 OP 得到了message sent to deallocated instance。所以 OP 要求找到被解除分配的对象,当整个类被解除分配时,这个方法(-dealloc())将被调用!!!! @MayankModi 所以现在,你得到了 DetailView 类的对象被释放的确切时刻。现在您需要查看您的代码并找出它被释放的原因。也许你持有弱引用,也许你弹出了持有该视图引用的 ViewController。【参考方案2】:

按 mac+shift+B 分析您的代码。它将显示泄漏对象和对象的保留/释放计数。

【讨论】:

【参考方案3】:

我认为delegate 属性可能是弱引用。一旦尝试使它强大。如果d 很弱,那么它也很强大。并检查它是否解决了问题!

更新:

如果有人在按钮上单击超过一次会发生什么?我认为它将重新定义_d。所以已经添加到self.view 的旧的 (_d) 将不会得到点或将失去参考。因此,如果您想在按钮单击时添加多个视图,请不要将其声明为属性或全局。在它自己喜欢的动作方法中声明和分配它,

 DetailView *d = [[DetailView alloc]initWithData:dict andImgId:[[_arrayHotelimg objectAtIndex:0] valueForKey:@"img_id"] isTour:NO];

【讨论】:

属性(非原子,分配)id 委托;和属性(非原子,强)DetailView *d; 你在哪里 _d = [[DetailView alloc]initWithData:dict andImgId:[[_arrayHotelimg objectAtIndex:0] valueForKey:@"img_id"] isTour:NO]; ?在 viewDidload 中? 单击 MainVC.m 中的按钮(我必须将此详细视图添加为子视图) 然后直接在操作方法中尝试self = [subviewArray objectAtIndex:0];self.frame = CGRectMake(0, TOP, SCREEN_WIDTH, SCREEN_HEIGHT);,而不是UIView 的子类的init 方法。在 action 方法中编写所有必要的代码。 让我们continue this discussion in chat。

以上是关于如何找到对象正在释放的位置的主要内容,如果未能解决你的问题,请参考以下文章

ATL 对象释放自身的安全位置

arcgis镶嵌至新栅格输出位置显示无法找到对象名

创建 ML - 是不是可以找到检测到的对象的位置?

当按下鼠标并释放鼠标时,如何保存鼠标位置?

我们如何在可放置 div 中释放项目的确切位置元素上放置

如何根据对象位置旋转图像?