【问题标题】:Objective-C - pointer not nil after destroying the objectObjective-C - 销毁对象后指针不为零
【发布时间】:2011-06-06 13:10:03
【问题描述】:

我正在使用 Objective-C 在我的 linux 上玩一点。实际上我正在努力学习它,但在完成这个任务时,我被卡住了。

代码如下:

#import <stdio.h>
#import <Foundation/NSObject.h>


int main(void) {

    NSObject *a = [[NSObject alloc] init];

    printf("Class retain count: %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n\n", (a==nil));

    [a retain]; 

    printf("Class retain count: %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n\n", (a==nil));

    [a release];

    printf("Class retain count: %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n\n", (a==nil));

    [a release];

    //printf("Class retain count:   %i\n", [a retainCount]);
    printf("Is pointer nil: %i\n", (a==nil));


    return 0;
}

这是输出:

类保留计数:1

指针为零:0

类保留数:2

指针为零:0

类保留计数:1

指针为零:0

指针为零:0

我已经注释掉了最后一个 printf,因为它使程序崩溃(我得到“分段错误 obj/test”,因为 a 没有设置为 nil ...)。那么我做错了什么?为什么指针不设置为 nil ?它只是保持它的旧值(在对象被删除之前)......

【问题讨论】:

  • retainCount 没用。不要叫它。
  • @bbum:你能解释一下原因吗?
  • 对象的保留计数是一个内部实现细节,通常没有意义(试试[@"foo" retainCount])。 stackoverflow.com/questions/4636146/when-to-use-retaincount
  • 既然是 2014 年,你应该使用 ARC,它彻底改变了一切。

标签: objective-c pointers object null


【解决方案1】:

释放对象不会将其设置为零。 release 将释放您的变量指向的对象(在本例中为 a),但是您的变量仍然指向相同的对象内存地址,除非您分配另一个地址,例如:

a = otherAddress;

通常你会这样做:

a = nil; //or
a = [[NSObject alloc] init]; //or
a = [MyObject objectWithSomething:smthg];

所以,如果您打算在 a 被释放后重用它,那么在完成后将其设置为 nil。为了避免“分段错误”错误,如果您尝试使用 a 并且它指向一个已释放的对象。

【讨论】:

  • 好吧,当你在a被释放之后重用它时,你会遇到一个错误,在它被释放之后就没有必要了。
  • @Jonathan Sterling:好吧,当您在a 被释放后重用它时会出现错误并且内存用于其他用途,不一定是在它被释放之后解除分配和重用。
  • 谢谢,我不知道为什么我认为它会自动设置为零:D
【解决方案2】:

为什么不将指针设置为 nil ?

因为指向 Objective-C 对象的指针只是指针。当你在纯 C 中 free 内存时,你不会期望你的指针被设置为 NULL。

【讨论】:

    【解决方案3】:

    指针不会变为nil,除非您将nil 分配给它。指针无效不意味着它将是nil。您必须像考虑任意整数一样考虑指针:如果将其设置为某个数字,它将继续具有该值,直到您设置它为止。

    这就是为什么您不能使用obj == nil 来检查对象是否仍然有效的原因。

    【讨论】:

      【解决方案4】:

      你必须在发布后明确地set the variablenil。

      [a release];
      //This below line say : i don't have need to use the variable anymore. 
      a = nil ;
      

      如果您没有使用任何变量,则首先使用release 并将其设置为nil 值。 (必须设置nil)。

      【讨论】:

        猜你喜欢
        • 2014-10-11
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        • 2023-02-08
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        相关资源
        最近更新 更多