gpt4 book ai didi

IOS:NSString 的发布未按预期工作

转载 作者:技术小花猫 更新时间:2023-10-29 11:15:11 25 4
gpt4 key购买 nike

我发现 NSString 有一个奇怪的行为。我尝试运行以下代码并注意到了这一点。

NSString *str = [[NSString alloc] initwithstring : @"hello"];
[str release];
NSLog(@" Print the value : %@", str);

在这里,在第三行应用程序应该崩溃,因为我们正在访问一个已释放的对象。但它正在打印 str 的值。它没有崩溃。但是对于 NSArray,我观察到了不同的行为。

NSArray *array = [[NSArray alloc] initwithobjects : @"1",  @"2", nil];
[array release];
NSLog(@"Print : %@", [array objectatindex : 0]);
NSLog(@"Print : %@", [array objectatindex : 0]);

代码有两个用于 NSArray 的 NSLog 语句。这里在执行第一个 NSLog 时释放后,就是打印值。但是当执行第二个 NSLog 时,应用程序崩溃了。应用程序崩溃是可以接受的,因为访问的数组已经被释放。但是当执行第一个 NSLog 时它应该崩溃。不是第二个。

帮我解决这个问题。在这些情况下如何发布。

谢谢吉森

最佳答案

第一个示例没有崩溃,因为字符串文字从未被释放。代码真的是:

NSString *str = @"hello";
[str release];

人们对内存管理中的字符串字面量感到厌烦,并错误地使用 == 来比较它们而不是 isEqualToString:。编译器进行了一些优化,导致误导性结果。

更新:

下面的代码证明了我的观点:

    NSString *literal = @"foo";
NSString *second = [NSString stringWithString:literal];
NSString *third = [NSString stringWithString:@"foo"]; // <-- this gives a compiler warning for being redundant
NSLog(@"literal = %p", literal);
NSLog(@"second = %p", second);
NSLog(@"third = %p", third);

此代码提供以下输出:

2013-02-28 22:03:35.663 SelCast[85617:11303] literal = 0x359c
2013-02-28 22:03:35.666 SelCast[85617:11303] second = 0x359c
2013-02-28 22:03:35.668 SelCast[85617:11303] third = 0x359c

注意所有三个变量都指向同一个内存。

关于IOS:NSString 的发布未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com