Ios 内存管理:此代码是否存在内存泄漏?

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

strB会泄漏吗?是否应该在ClassB dealloc方法中发布它?

您将属性定义为retain,但不保留字符串(只需使用@synthesis就不必定义getter和setter)


我认为您应该在ClassB的dealloc中释放strB是的,您必须在ClassB dealloc中添加一个释放,因为您在setter中保留strB

对象“strB”寿命:

  • NSString*strA=[[NSString alloc]initWithString:@“测试字符串”];->+一,
  • [classB settrb:strA];->+一,
  • [strA发布];->-一,

我假设您尚未合成属性,并且您定义的自定义setter就是所有调用的内容……如果这是事实,那么您实际上过度释放了字符串,因为您没有保留属性

// 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;
      }    


        }