代码之家  ›  专栏  ›  技术社区  ›  kubi

在什么情况下,地址处的对象可以更改?(Obj-C)

  •  0
  • kubi  · 技术社区  · 15 年前

    我有一个带代表的控制器。

    @interface MyConversionController : NSObject {
        id <ConversionDelegate> _delegate;
    }
    @property (assign) id delegate;
    @end    
    
    @implementation
    @synthesize delegate = _delegate;
    @end
    

    我得到 Unrecognized selector sent to instance 0x36c4a0 错误。我在上设置了一个断点 -(void)setDelegate(id)delegate 方法,以便我可以观察传入我的 MyConversionController 班级。我的 setDelegate 方法被调用两次,第一次是地址处的对象 0x36c4a0 我知道这符合 <ConversionDelegate> 协议。第二次调用此方法时,传入了另一个同样符合协议的对象。当开始对委托调用方法时,方法调用将发送到第一个对象。( 0x36C4A0 )现在是另一种物体(通常是 CFString __NSFastEnumerationEnumerator 如果有什么不同的话)。

    有人知道为什么会这样吗?


    运行后 malloc_history 我看到第一个地址,那个给我带来麻烦的地址,在我到达之前被分配和释放了很多次。第二个对象只分配了一次。在什么情况下指针会像这样被重用?

    2 回复  |  直到 15 年前
        1
  •  1
  •   nall    15 年前

    malloc_history <pid> 0x36c4a0 # insert the address in question for the 2nd arg
    

    MallocStackLogging


    delegate = [[[ConversionDelegateClass alloc] init] autorelease];
    controller.delegate = delegate
    

        2
  •  0
  •   kubi    15 年前