我学会了一种释放像这样的物体的方法。
NSMutableString *string1 = [[NSMutableString alloc]initWithFormat:@"ABCDEF"];
:
progress some code.
:
string1 = nil;
[string1 release];
问题如下。
string1 = nil; < =通过分配nil来丢失string1指针。
然后,[string1 release]; < =可以向string1接收者发送消息吗?
string1 = nil;
[string1 release];
[string1 release];
string1 = nil;
什么是正确的序列?
[补充问题..]
是否可以在自定义方法中声明对象的@property(NSString,NSNumner,NSARRAY ...)?
答案 0 :(得分:3)
这实际上并没有完成你想要做的事情。它似乎只能工作,因为Objective C允许您向nil对象指针发送消息。在你的例子中你是正确的,你丢失了指向已分配内存的指针,因此,保持未释放。
执行此操作的正确方法是在字符串上调用release,然后将其设置为nil(在示例中为第二个场景)。
顺便说一句,请注意,如果 string1 是带有retain关键字的类属性,那么您可以执行以下操作:
self.string1 = nil;
这实际上会释放变量。这依赖于与合成相关的实现细节,因此您不必担心它:您的原始问题。只是一个有趣的旁注。
答案 1 :(得分:2)
你的#2是正确的顺序。首先释放您分配的对象,然后将指针设置为nil
以防止随后对其执行任何其他操作(现在不可靠的地址)。
在#1中,一旦你设置了一个指向nil
的指针,它就不再指向实际的对象,所以在(nil)指针上调用release
不会导致错误,但不会做任何事。
答案 2 :(得分:0)
关于Perception解释的一些额外信息。合成的setter生成的代码看起来有点像(@property (nonatomic, copy) NSString *string
):
- (void)setString:(NSString *)newString
{
if ([string isEqualToString:newString]) return;
[string autorelease];
string = [newString copy];
}
现在,当字符串具有当前值test
而newString具有值nil
时,则该字符串将被释放并且不会发生任何复制,因为copy
消息将被发送到nil
。这就是self.string = nil
正确释放字符串同时将其指针设置为nil的原因。