-2

我有 2 类,A 类和 B 类。

ObjectA 有一个属性是 ObjectB。现在的情况是——

  1. ObjectA 调用 ObjectB 方法 - [ObjectB methodB1]。
  2. 执行方法[ObjectB methodB1]后,objectB向objectA发送回调。
  3. 获取回调 ObjectA 释放 ObjectB。是按照这样的方式做的——

    [对象B释放];对象B = nil;

  4. ObjectB有另一个方法->methodB2,它在向objectA发送回调后开始执行[ObjectB methodB2]并且它崩溃了,因为ObjectA在执行时释放了ObjectB,所以没有对象然后ObjectB。

那么如果如何解决这个问题呢?

感谢您的回答。

4

4 回答 4

2

在执行 [ObjectB methodB2] 之后将您的回调移动到 ObjectA。或者创建两个回调:一个在 [ObjectB methodB1] 之后,另一个在 [ObjectB methodB2] 之后,在第二个回调之后释放 ObjectB

于 2013-07-30T12:44:35.107 回答
0

这里有两种情况:

1) 当 ObjectA 调用两次时,ObjectB 可能有不同的属性传递给它

2) 对象 B 只传递了一组属性,对象 A 需要 Bethod B1 和 B2 才能运行,而对象 B 保留相同的属性。

3) 如果对象 B 需要传递给它的新参数,使用 getter 和 setter?

场景一:

对象A.m:

    ...
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
    // why release when you can repoint?
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"another parameter"];
     NSString *callback2 = [objectB methodB2];
    [objectB release];

场景二:

对象A.m:

    ...
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
     NSString *callback2 = [objectB methodB2];
    [objectB release];

场景 3:

对象A.m:

    ...
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
    [objectB setSomeParameter:@"another parameter"];
     NSString *callback2 = [objectB methodB2];
    [objectB release];

当您说 ObjectB 回调时?我希望你不是说:

对象A.m:

     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
     ...

对象B.m:

     ...
     //DO some work in method B1
     ObjectA *objectA [[ObjectA alloc] init];
     [objectA callback];

那是一个记忆线索,然后……如果这就是你的意思,那么我建议阅读我上面的场景或查看 NSNotificationCentre 通知以获取跨对象通知,即回调。

于 2013-07-31T10:24:38.147 回答
0

methodB1启动时应该保留self,完成时释放。

于 2013-07-30T14:29:01.250 回答
0
ObjectB.ObjectA = nil;
[ObjectB release];
ObjectB = nil;
于 2013-07-30T13:42:02.647 回答