XCode 7仪器 - 为什么会泄漏?

时间:2015-12-16 22:10:59

标签: objective-c xcode memory-leaks

我陷入了一个奇怪的事情:为什么下面的代码片段产生泄漏(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构造函数(@ {....}),并且不会产生任何泄漏。

有类似经验的人吗?

0 个答案:

没有答案