Ios 内存管理:此代码是否存在内存泄漏?
strB会泄漏吗?是否应该在ClassB dealloc方法中发布它?您将属性定义为retain,但不保留字符串(只需使用@synthesis就不必定义getter和setter)Ios 内存管理:此代码是否存在内存泄漏?,ios,memory-management,memory-leaks,Ios,Memory Management,Memory Leaks,strB会泄漏吗?是否应该在ClassB dealloc方法中发布它?您将属性定义为retain,但不保留字符串(只需使用@synthesis就不必定义getter和setter) 我认为您应该在ClassB的dealloc中释放strB是的,您必须在ClassB dealloc中添加一个释放,因为您在setter中保留strB 对象“strB”寿命: NSString*strA=[[NSString alloc]initWithString:@“测试字符串”];->+一, [classB s
我认为您应该在ClassB的dealloc中释放strB是的,您必须在ClassB dealloc中添加一个释放,因为您在setter中保留strB 对象“strB”寿命:
- NSString*strA=[[NSString alloc]initWithString:@“测试字符串”];->+一,
- [classB settrb:strA];->+一,
- [strA发布];->-一,
// ClassB.h
@property (nonatomic, retain) NSString *strB;
// ClassB.m
// custom setter
-(void) setStrB:(NSString *)newStr {
strB = newStr;
}
现在,如果您试图访问classB strB属性,您可能会因为过度释放而崩溃
NSString *strA = [[NSstring alloc] initWithString:@"test string"]; //string with +1 ref
ClassB *classB = [[ClassB alloc] init];
[classB setStrB:strA]; //doesnt increase the ref count
[strA release]; //string with 0 ref count (which means OS will reclaim the memory allocated for the string)
如果要在setter中保留字符串,那么应该在classB dealloc中释放它。但实际上,您必须小心编写setter的方式(您可能只需要合成并为您生成属性),下面是setter的实际外观
在这里,如果strB在您实际设置之前不是nil,您将释放它,它将检查a是否为nil,在这种情况下,您只需将strB设置为nil,否则将strB设置为a并保留
希望这有帮助谢谢,我忘了在示例中添加@synthesis行。我想这就解释了为什么我的应用程序中存在大量内存泄漏和问题。如果strB和a都引用同一个字符串(这是完全可能的),那么setter将在保留该字符串之前释放该字符串,如果幸运的话,将导致EXC_BAD_访问。自定义setter应该如下所示:-(void)setStrb:(NSString*)a{[a retain];[strB release];strB=a;}或者,您可以在赋值之前自动释放strB。不管你怎么做,在保留a之前都不能释放strB。在“声明”中有一个retain,但是setter的实现没有retain。我认为你在这里是不对的。使用自定义setter不会增加strB上的保留计数。因此,代码没有泄漏,但也没有做您想要做的事情,因为稍后您将无法访问classB.strB,因为它已发布。
NSString *strA = [[NSstring alloc] initWithString:@"test string"]; //string with +1 ref
ClassB *classB = [[ClassB alloc] init];
[classB setStrB:strA]; //doesnt increase the ref count
[strA release]; //string with 0 ref count (which means OS will reclaim the memory allocated for the string)
-(void)setStrb:(NSString*)a
{
if(a==nil)
strB=nil;
else
{
[a retain];
if(strB)
[strB release];
strB=a;
}
}