【问题标题】:How to stop object code from excution if it's already released in objective C如果目标代码已经在目标 C 中发布,如何阻止目标代码执行
【发布时间】:2013-07-30 12:38:39
【问题描述】:

我有 2 个班级,classA 和 classB。

ObjectA 有一个属性是 ObjectB。现在的场景是-

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

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

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

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

感谢您的回答。

【问题讨论】:

  • 显示实际代码并提供异常的详细信息(名称、消息、堆栈跟踪/位置)。

标签: objective-c cocoa-touch cocoa


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    ObjectB.ObjectA = nil;
    [ObjectB release];
    ObjectB = nil;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这里有两个场景:

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

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

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

        场景 1:

        ObjectA.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];
        

        场景 2:

        ObjectA.m:

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

        场景 3:

        ObjectA.m:

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

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

        ObjectA.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];
        

        那是一个内存线索,然后...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-14
          • 2014-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多