我陷入了一个奇怪的事情:为什么下面的代码片段产生泄漏(attrDefault没有发布)? (假设,'font'之前已定义,self.text指的是NSString *):
{
NSStringDrawingContext* context = [[NSStringDrawingContext alloc] init];
NSDictionary* attrDefault = @{ NSForegroundColorAttributeName : [UIColor blackColor],
NSBackgroundColorAttributeName : [UIColor clearColor],
NSFontAttributeName : font,
};
frame.size.height = 1024;
CGRect bounding = [self.text boundingRectWithSize:frame.size
options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading|NSStringDrawingUsesDeviceMetrics
attributes:attrDefault context:context];
frame.size.height = bounding.size.height;
[context release];
}
有什么想法吗?
更新
令人惊讶的是,如果在@autoreleasepool语句中嵌入了相同的代码,那么泄漏就会消失。
@autoreleasepool {
NSStringDrawingContext* context = [[NSStringDrawingContext alloc] init];
NSDictionary* attrDefault = @{ NSForegroundColorAttributeName : [UIColor blackColor],
NSBackgroundColorAttributeName : [UIColor clearColor],
NSFontAttributeName : font,
};
frame.size.height = 1024;
NSString* text = self.text;
CGRect bounding = [text boundingRectWithSize:frame.size
options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading|NSStringDrawingUsesDeviceMetrics
attributes:attrDefault context:context];
frame.size.height = bounding.size.height;
[context release]; }
顺便说一下,我没有使用XCode 6进行任何泄漏。
这很奇怪,因为我在代码中的很多位置都使用了NSDictionary构造函数(@ {....}),并且不会产生任何泄漏。
有类似经验的人吗?