Ios 代表don';不存在,除坏访问外

Ios 代表don';不存在,除坏访问外,ios,objective-c,json,Ios,Objective C,Json,我有一个TableViewController,它在运行时生成另一个类的实例,并用它调用json,例如 TableViewController; JSONClass将继续从web检索数据,一旦完成,将向tableViewController发送一个委托方法调用“JSONClassDataReceived”。比如, JSONClass; TableViewController; 然后填充相关数据 在TableViewController上调用委托方法JSONClassDataReceived之前,

我有一个TableViewController,它在运行时生成另一个类的实例,并用它调用json,例如

TableViewController; JSONClass将继续从web检索数据,一旦完成,将向tableViewController发送一个委托方法调用“JSONClassDataReceived”。比如,

JSONClass; TableViewController; 然后填充相关数据

在TableViewController上调用委托方法JSONClassDataReceived之前,当在TableViewController上按下back按钮时,如何停止JSONClass

我试过了

jc.JSONClassDelegate = nil;
jc = nil;
当按下后退按钮时,我的应用程序崩溃,因为JSONClass已到达JSONClassDelegate,因此无法找到方法-(void)JSONClassDataReceived,因为tableViewController视图已不存在。我还尝试在JSONClass中实现dealloc。似乎都不管用

- (void)dealloc{
    self.view = nil;
}
我在线路上有错误EXC\u BAD\u访问

if (JSONPromotionsLocationsDelegate && [JSONPromotionsLocationsDelegate respondsToSelector:@selector(JSONPromotionsLocationsDataReceived)]) {
            [JSONPromotionsLocationsDelegate JSONPromotionsLocationsDataReceived];
        }

首先,请确保在给您的代表打电话之前:

if (self.delegate && [self.delegate respondsToSelector:@selector(JSONClassDataReceived)]) {
    [self.delegate JSONClassDataReceived];
}
除此之外,在JSONClass'
-(void)dealoc
方法中,您可以停止web调用。如果使用ARC,请确保不要调用
[super dealoc]
。对于要调用的
dealloc
方法,您需要将
jc
对象保持为空


希望这能有所帮助。

首先,在给您的代表打电话之前,请确保:

if (self.delegate && [self.delegate respondsToSelector:@selector(JSONClassDataReceived)]) {
    [self.delegate JSONClassDataReceived];
}
除此之外,在JSONClass'
-(void)dealoc
方法中,您可以停止web调用。如果使用ARC,请确保不要调用
[super dealoc]
。对于要调用的
dealloc
方法,您需要将
jc
对象保持为空


希望这有帮助。

当发布关于崩溃到堆栈溢出的问题时,包含崩溃日志或堆栈跟踪将有助于帮助您的同事解决问题

排除EXC_BAD_访问崩溃故障的正确方法是使用。这将准确地告诉您是什么导致了此问题

没有这些信息,我们只能猜测

但在你的情况下,我可以做一个有根据的猜测。 您的委托在某个点被解除分配,之后您将尝试使用解除分配的内存。这很可能是因为您没有将委托声明为弱引用。这一点在中特别提到

首先,将委托声明为弱属性

@property(非原子,弱)id JSONClassDelegate

别忘了合成它。不合成属性可能导致不好的结果

现在,在调用委托的方法中,您应该在方法期间将其作为强引用。这可以防止在您使用它时将其释放。例如:

__strong id aDelegate = [self JSONClassDelegate];
if ([JSONClassDelegate respondsToSelector:@selector(JSONPromotionsLocationsDataReceived)]) {
    [JSONClassDelegate JSONPromotionsLocationsDataReceived];
}

这将创建一个指向弱引用的强局部堆栈变量。它将一直保留,直到超出范围。

当发布有关崩溃到堆栈溢出的问题时,最好包含崩溃日志或堆栈跟踪,以使您的同事能够帮助您解决问题

排除EXC_BAD_访问崩溃故障的正确方法是使用。这将准确地告诉您是什么导致了此问题

没有这些信息,我们只能猜测

但在你的情况下,我可以做一个有根据的猜测。 您的委托在某个点被解除分配,之后您将尝试使用解除分配的内存。这很可能是因为您没有将委托声明为弱引用。这一点在中特别提到

首先,将委托声明为弱属性

@property(非原子,弱)id JSONClassDelegate

别忘了合成它。不合成属性可能导致不好的结果

现在,在调用委托的方法中,您应该在方法期间将其作为强引用。这可以防止在您使用它时将其释放。例如:

__strong id aDelegate = [self JSONClassDelegate];
if ([JSONClassDelegate respondsToSelector:@selector(JSONPromotionsLocationsDataReceived)]) {
    [JSONClassDelegate JSONPromotionsLocationsDataReceived];
}
这将创建一个指向弱引用的强局部堆栈变量。它将一直保留,直到超出范围。

不,您不能(有效地)“测试地址是否包含有效对象”。即使您能够在内存分配系统的内部进行搜索并确定您的地址指向有效的对象,也不一定意味着它就是您之前引用的同一个对象:该对象可能已被释放,而另一个对象是在同一内存地址创建的

从中找到。

否,您不能(有效地)“测试地址是否包含有效对象”。即使您能够在内存分配系统的内部进行搜索并确定您的地址指向有效的对象,也不一定意味着它就是您之前引用的同一个对象:该对象可能已被释放,而另一个对象是在同一内存地址创建的


从中找到。

我似乎已通过简单地将委托设置为“弱”而不是“分配”来修复崩溃

崩溃
@property(非原子,赋值)id JSONClassDelegate;
无碰撞
@property(非原子,弱)id JSONClassDelegate;

我似乎已经通过简单地将委托设置为“弱”而不是“分配”修复了崩溃

崩溃
@property(非原子,赋值)id JSONClassDelegate;
无碰撞
@property(非原子,弱)id JSONClassDelegate;

这不起作用,仍然会导致崩溃。为调用
JSONClassDataReceived
方法的任何类提供EXC\u BAD\u访问。我的ClassA调用JSONClass来检索数据。ClassA没有dealloc方法。相反,它有一个-(iAction)btnBack:(id)发送方{jc=nil;jc.JSONClassDelegate=nil;}等等,
JSONClass
jc
在原始帖子中)的实例中有一个iAction?
__strong id aDelegate = [self JSONClassDelegate];
if ([JSONClassDelegate respondsToSelector:@selector(JSONPromotionsLocationsDataReceived)]) {
    [JSONClassDelegate JSONPromotionsLocationsDataReceived];
}
@property (nonatomic, assign)id <JSONClassDelegate> JSONClassDelegate;
@property (nonatomic, weak)id <JSONClassDelegate> JSONClassDelegate;