目标C中的自动释放和NSString

时间:2010-09-05 16:00:39

标签: objective-c

我现在和ObjC玩的很多,就“自动释放”而言,我感到很遗憾。

在我的.h:

NSString *sAStringMember;

在我的.m:

-(void) createAString
{
 NSString *sAString = [NSString stringWithString:[dummyCode...get String ffrom some input field for instance]];
 sAStringMember = sAString;
}

几个简短的问题:

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

  2. 如果上述假设是正确的,那么在为其分配sAString然后保留它之前,是否可以选择释放sAStringMember?

  3. 最好是使用“copy”将sAString复制到sAStringMember我想?

2 个答案:

答案 0 :(得分:2)

(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

(另外,请避免使用匈牙利表示法。)

答案 1 :(得分:0)

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

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

在许多书籍中,您可以读到在处理下一个GUI事件时会发生这种情况,但这不是肯定的。在函数调用序列中,每个函数都可以打开和关闭它自己的自动释放池。

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