代码之家  ›  专栏  ›  技术社区  ›  Jaka Jančar

静态库3.1.3+app 3.2/4.0b2:initWithNibName:bundle:corrupting ivar

  •  1
  • Jaka Jančar  · 技术社区  · 14 年前

    我有一个用3.1.3构建的静态库。我将它包含在一个应用程序中,我正在用3.2/4.0b2构建这个应用程序。

    静态库包含一个uiviewcontroller子类,它在-in it中调用[super initwithnibname:nil bundle:nil]。

    此方法依次调用_docommonsetup,这会损坏子类的ivar之一:

    0x003a68e9  <+0014>  pop    %ebx
    0x003a68ea  <+0015>  mov    0x8(%ebp),%esi
    0x003a68ed  <+0018>  movl   $0x1,0x8(%esp)
    0x003a68f5  <+0026>  mov    0x1d98327(%ebx),%eax
    0x003a68fb  <+0032>  mov    %eax,0x4(%esp)
    0x003a68ff  <+0036>  mov    %esi,(%esp)
    0x003a6902  <+0039>  call   0x20e5f52 <dyld_stub_objc_msgSend>
    0x003a6907  <+0044>  movl   $0x44898000,0x70(%esi)  <- corrupting subclass's ivar (setting it to 0x4489..)
    

    我可以将静态库精细地用于使用3.0或3.1.3构建的应用程序。但是3.2和4.0会导致问题。

    这应该有效吗,或者静态库只能在使用相同或更旧版本的sdk构建的应用程序中使用吗?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Jaka Jančar    14 年前

    这是因为4.0甚至在模拟器上都在使用现代运行时,而旧版本则没有。编译的库不兼容。