我现在和ObjC玩的很多,就“自动释放”而言,我感到很遗憾。
在我的.h:
NSString *sAStringMember;
在我的.m:
-(void) createAString
{
NSString *sAString = [NSString stringWithString:[dummyCode...get String ffrom some input field for instance]];
sAStringMember = sAString;
}
几个简短的问题:
在“createAString:”中创建一个自动释放的字符串“sAString”。如果sAString是自动释放的(什么时候会发生?),我的成员“sAStringMember”也会指向一个无效的地址,对吗?
如果上述假设是正确的,那么在为其分配sAString然后保留它之前,是否可以选择释放sAStringMember?
最好是使用“copy”将sAString复制到sAStringMember我想?
勒
答案 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事件时会发生这种情况,但这不是肯定的。在函数调用序列中,每个函数都可以打开和关闭它自己的自动释放池。
如果一个函数做了很多工作,它可以简单地创建自动释放池并随时释放自动释放注册的对象。