2011-04-07 67 views
1

我檢測到[NSCFString copyWithZone的內存泄漏:]我做了一個項目搜索,只有一個地方使用了單例類中的copyWithZone函數。Singleton類的copyWithZone函數導致泄漏問題

該宏被廣泛使用。我應該如何糾正?

#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \ 
\ 
static classname *shared##classname = nil; \ 
\ 
+ (classname *)shared##classname \ 
{ \ 
    @synchronized(self) \ 
    { \ 
     if (shared##classname == nil) \ 
     { \ 
      shared##classname = [[self alloc] init]; \ 
     } \ 
    } \ 
    \ 
    return shared##classname; \ 
} \ 
\ 
+ (id)allocWithZone:(NSZone *)zone \ 
{ \ 
    @synchronized(self) \ 
    { \ 
     if (shared##classname == nil) \ 
     { \ 
      shared##classname = [super allocWithZone:zone]; \ 
      return shared##classname; \ 
     } \ 
    } \ 
    \ 
    return nil; \ 
} \ 
\ 
- (id)copyWithZone:(NSZone *)zone \ 
{ \ 
    return self; \ 
} \ 
\ 
+1

泄漏是在NSCFString,這是NSString的一個私人子類。你的宏可能與它無關。 'copyWithZone:'每當你調用'copy'時都會自動調用,所以你應該在你的項目中搜索你複製NSString(或者NSMutableString)而不釋放舊字符串的地方。 – ughoavgfhw 2011-04-07 23:09:20

回答

0

就像評論所說,copyWithZone部分是有點紅鯡魚。

查找在您使用NSString的,具體在哪裏,你複製它們,比如這是一個內存泄露

@property (nonatomic, copy) NSString* title; 


... 


self.title = [textView.title retain] // Over retained (and wont show up on the static analyzer) 
self.title = @"B";