2

我所做的是

int main(int argc, char *argv[]){
    NSString *str = [[NSString alloc] init];
    str = @"a a a a a a a a a ";
    [str release];
    NSLog(@"string is %@",str);
    return 0; 
}

我认为 string 将是 nil 因为我们在打印它之前释放它。然而,事实并非如此。所以,我的消费是错误的。

任何人都可以建议我并纠正我。欢迎任何意见。谢谢

4

5 回答 5

3

您正在那里泄漏内存,首先您分配一个新的空NSString对象,然后为指针分配一个静态字符串文字,从而有效地泄漏您之前分配的内存。然后你释放一个你不拥有的对象,正如 The Saad 所指出的,然后你应该注意 release 不会将指针设置为 nil ,而只是释放可能会或可能不会以取消分配结束的对象(这,假设它会释放对象,也不会将指针设置回nil)。

于 2012-05-07T13:32:14.680 回答
2

str变量是一个指向字符串对象的指针,本质上包含一个内存地址。向对象发送类似的消息retain不会更改变量的值。

仅仅因为字符串被释放不会导致变量失去它的值。您必须明确地将变量设置为 nil 才能发生这种情况。

请注意,使用 iOS 5 下的 ARC,您可以获得弱引用/指针,当它们的底层对象被释放时,这些引用/指针将变为 nil。您可以通过在变量声明前加上__weak关键字(或weak在属性声明中使用)来做到这一点。

于 2012-05-07T13:32:59.813 回答
2
NSString *str = [[NSString alloc] init];

这声明了一个变量,该变量是 的实例的指针,为 的实例NSString分配内存NSString,初始化该内存,然后将指向该内存的指针分配给您声明的变量。

str = @"a a a a a a a a a ";

这将创建一个NSString常量并将指向它的指针分配给您声明的变量。由于您不再拥有对NSString您创建的原始对象的引用,因此您已经泄漏了为它分配的内存。

[str release];

这表明该代码不再希望成为分配给 的内存的所有者str。当您使用字符串文字创建它时,该对象将始终存在于您的程序中,并且释放它什么也不做。

我认为 string 将是 nil 因为我们在打印它之前释放它。

释放对象永远不会将其设置为nil.

于 2012-05-07T13:43:40.930 回答
1

字符串常量不会被释放;它们既没有明确发布也没有自动发布;它们只是常量(顺便说一下,它们在作用域结束时被释放)。

因此,只有在您之前保留它们时才释放它们

于 2012-05-07T13:29:36.897 回答
0

以下是更正的来源:

恐怕在完全理解正在发生的事情之前还有很多东西要学。您还应该了解 malloc(尽管不要使用它)以及指针在 C 中的工作方式。

int main(int argc, char *argv[]){
     NSString *str = [[NSString alloc] initWithString:@"a a a a a a a a a "];
     [str release];
     str = nil;
     NSLog(@"string is %@",str);
     return 0; 
}


int main(int argc, char *argv[]){
     NSString *str = @"a a a a a a a a a ";
     // DONT Call this - the str [str release]; - no need to release this kind of string
     NSLog(@"string is %@",str);
     return 0; 
}
于 2012-05-07T14:42:06.957 回答