Objective c 目标C中的自动释放和NSString

Objective c 目标C中的自动释放和NSString,objective-c,Objective C,我现在一直在玩ObjC,以至于在“自动释放”方面我感到失落 在my.h中: NSString *sAStringMember; 在my.m中: -(void) createAString { NSString *sAString = [NSString stringWithString:[dummyCode...get String ffrom some input field for instance]]; sAStringMember = sAString; } 几个简短的问题: 在

我现在一直在玩ObjC,以至于在“自动释放”方面我感到失落

在my.h中:

NSString *sAStringMember;
在my.m中:

-(void) createAString
{
 NSString *sAString = [NSString stringWithString:[dummyCode...get String ffrom some input field for instance]];
 sAStringMember = sAString;
}
几个简短的问题:

  • 在“createAString”中,将创建一个自动删除的字符串“sAString”。如果sAString是自动释放的(什么时候会发生?),那么我的成员“sAStringMember”也会指向一个无效的地址,对吗

  • 如果上述假设是正确的,那么在将sAString分配给sAString成员并保留它之前,是否可以先释放sAStringMember

  • 我想最好是使用“复制”将sAString复制到sAStringMember

  • 勒内(1)是的。
    (3)
    -retain
    -copy
    都可以

    最好使用声明的属性

    @interface Foo : ... {
      NSString* sAStringMember;
    }
    @property(copy) NSString* sAStringMember;   // or retain.
    @end
    ...
    @implementation Foo
    @synthesize sAStringMember;
    ...
    -(void) createAString {
      self.sAStringMember = [dummyCode...get String ffrom some input field for instance];
    }
    -(void)dealloc {
      ...
      [sAStringMember release];
      [super dealloc];
    }
    @end
    

    (另外,请避免使用匈牙利符号。)

    是的,如果您从其他地方保留指向某个对象的指针并将其保留,则必须始终复制或保留它。保留是首选,除非您想修改它,因为它不分配额外的内存,而且速度更快

    对于有关何时释放字符串的问题,唯一可能的答案是:函数返回后的某个时间

    在许多书中,您可以看到它将在下一个GUI事件被处理时发生,但这并不确定。在函数调用序列中,每个函数都可以打开和关闭自己的自动释放池

    如果一个函数做了很多工作,它可以简单地创建它的自动释放池,并随时释放自动释放注册的对象