0

我有一个财产说

@property(nonatomic,assign) NSString *str;

现在我有类似的东西

self.str = [[NSString alloc] init];
self.str = @"test";
NSLog(@"%@",str);
[self.str release];

当我运行时,我可以看到“潜在的内存泄漏”泄漏。

为什么它显示我泄漏?

请指导我我是iOS的学习阶段

4

3 回答 3

5

换句话说(我只是在这里扩展 Anoop 的答案),你有两个字符串,而不是一个。

self.str = [[NSString alloc] init];
self.str = @"test";

第一行右边的东西是一个字符串:[[NSString alloc] init]。但是在第二行中,您将其扔掉,用不同的字符串替换它,即@"test". 现在没有指向第一个字符串的参考。因此它泄漏了,因为它永远不能被释放,也不能为它做任何其他事情。

第一行中创建的字符串的情况是,在第二行之后,就像该图第二个面板中“thing1”的情况:

在此处输入图像描述

没有人指向它,因此它的内存无法管理,它永远处于孤立状态(泄漏)。

于 2013-04-11T17:53:54.290 回答
3
self.str = [[NSString alloc] init]; //1st

分配了一个未使用的字符串。

self.str = @"test";  // 2nd

另一个常量字符串“test”被分配但被释放。

所以第一个是泄漏。

于 2013-04-11T17:50:57.323 回答
2

当您使用工厂方法或使用alloc、new、retain、copy、mutableCopy创建对象时,您的对象每次都有+1 保留计数。在这种情况下,您拥有对象。您有责任发布它。因此,您需要在使用完对象后释放对象,这会导致对象的-1 保留计数

由于您已经在创建它的属性,因此没有必要再次分配您的字符串。

它有它的getter setter +你再次分配它,所以给你一个泄漏。

于 2013-04-11T18:04:30.593 回答