如何检查对象是否为';t在Objective-C上解除分配?

如何检查对象是否为';t在Objective-C上解除分配?,objective-c,class,object,memory-management,Objective C,Class,Object,Memory Management,如何检查对象是否未在Objective-C上解除分配 以下标准条件仅在对象初始化时检查: NSObject *objectVariable = nil; ... if (objectVariable) {...} 我同意这些评论,如果你做的内存管理是正确的,应该没有必要进行这样的检查。我也不知道有这样的检查,如果地址被一个新对象填充,检查会通过,但仍可能使你的应用程序崩溃 我的建议是: 阅读手动内存管理规则,特别注意块如何影响内存管理、alloc/init方法、何时使用assign等。内存管

如何检查对象是否未在Objective-C上解除分配

以下标准条件仅在对象初始化时检查:

NSObject *objectVariable = nil;
...
if (objectVariable) {...} 

我同意这些评论,如果你做的内存管理是正确的,应该没有必要进行这样的检查。我也不知道有这样的检查,如果地址被一个新对象填充,检查会通过,但仍可能使你的应用程序崩溃

我的建议是:

  • 阅读手动内存管理规则,特别注意块如何影响内存管理、alloc/init方法、何时使用assign等。内存管理规则应该成为您的第二天性。首先
  • 在应用程序上运行静态分析并修复所有内存错误。修复所有错误真的,这些都是你应用程序中的错误。(
    CMD+Shift+B
    或菜单中的
    Product->Analyze
  • 使用僵尸在仪器中再现崩溃。阅读“保留/释放”报告,找出对象可能被过度释放的位置。(
    CMD+I
    Product->Profile
    。在出现的窗口中选择僵尸)
  • 考虑转换为圆弧。转换为ARC并不能让您完全摆脱对ObjC内存管理的理解,但它会减轻您的很多负担

  • 我同意这些评论,如果你做的内存管理是正确的,应该没有必要进行这样的检查。我也不知道有这样的检查,如果地址被一个新对象填充,检查会通过,但仍可能使你的应用程序崩溃

    我的建议是:

  • 阅读手动内存管理规则,特别注意块如何影响内存管理、alloc/init方法、何时使用assign等。内存管理规则应该成为您的第二天性。首先
  • 在应用程序上运行静态分析并修复所有内存错误。修复所有错误真的,这些都是你应用程序中的错误。(
    CMD+Shift+B
    或菜单中的
    Product->Analyze
  • 使用僵尸在仪器中再现崩溃。阅读“保留/释放”报告,找出对象可能被过度释放的位置。(
    CMD+I
    Product->Profile
    。在出现的窗口中选择僵尸)
  • 考虑转换为圆弧。转换为ARC并不能让您完全摆脱对ObjC内存管理的理解,但它会减轻您的很多负担

  • 我同意这些评论,如果你做的内存管理是正确的,应该没有必要进行这样的检查。我也不知道有这样的检查,如果地址被一个新对象填充,检查会通过,但仍可能使你的应用程序崩溃

    我的建议是:

  • 阅读手动内存管理规则,特别注意块如何影响内存管理、alloc/init方法、何时使用assign等。内存管理规则应该成为您的第二天性。首先
  • 在应用程序上运行静态分析并修复所有内存错误。修复所有错误真的,这些都是你应用程序中的错误。(
    CMD+Shift+B
    或菜单中的
    Product->Analyze
  • 使用僵尸在仪器中再现崩溃。阅读“保留/释放”报告,找出对象可能被过度释放的位置。(
    CMD+I
    Product->Profile
    。在出现的窗口中选择僵尸)
  • 考虑转换为圆弧。转换为ARC并不能让您完全摆脱对ObjC内存管理的理解,但它会减轻您的很多负担

  • 我同意这些评论,如果你做的内存管理是正确的,应该没有必要进行这样的检查。我也不知道有这样的检查,如果地址被一个新对象填充,检查会通过,但仍可能使你的应用程序崩溃

    我的建议是:

  • 阅读手动内存管理规则,特别注意块如何影响内存管理、alloc/init方法、何时使用assign等。内存管理规则应该成为您的第二天性。首先
  • 在应用程序上运行静态分析并修复所有内存错误。修复所有错误真的,这些都是你应用程序中的错误。(
    CMD+Shift+B
    或菜单中的
    Product->Analyze
  • 使用僵尸在仪器中再现崩溃。阅读“保留/释放”报告,找出对象可能被过度释放的位置。(
    CMD+I
    Product->Profile
    。在出现的窗口中选择僵尸)
  • 考虑转换为圆弧。转换为ARC并不能让您完全摆脱对ObjC内存管理的理解,但它会减轻您的很多负担

  • 您不能事后检查对象是否已解除分配,因为对解除分配的对象执行任何操作都是无效的(一旦对象解除分配,用于指向它的任何指针现在都是无效指针,取消引用它是未定义的行为)。因为你不知道它是否被释放,也不知道它可能被释放,所以你不能以任何方式有意义地检查它。如果您试图检查一个解除分配的对象,它很可能“看起来”像一个有效的对象(它是未定义的行为,所以任何行为都是可能的)

    如果这是您自己的类的对象,那么最明显的事情就是在类的
    -dealoc
    方法中打印一些内容或执行一些其他指示符操作。它将告诉您何时解除分配

    即使这是一个不属于您自己的类的对象,您也可以1)添加
    -dealoc
    作为类别方法,如果该类没有覆盖
    -dealoc
    ,或者2)如果该类确实覆盖了
    -dealoc
    方法,则可以将其旋转。然后你可以在你的版本中打印一些东西

    你也可以用仪器来描绘它;仪器可以告诉你