为啥不使用 autoreleasepool 块不会抛出错误?

Posted

技术标签:

【中文标题】为啥不使用 autoreleasepool 块不会抛出错误?【英文标题】:Why not using autorleasepool block does not throw error?为什么不使用 autoreleasepool 块不会抛出错误? 【发布时间】:2012-08-06 11:58:01 【问题描述】:

我知道当我们使用自定义线程来创建对象并使用它们时。我在 ios 应用程序中尝试了以下代码,它没有抛出任何错误。为什么?

-(void)Sample

            NSLog(@"Sample");
            NSString *temp= @"asdfasdf";

            NSArray *tempAray = [NSArray arrayWithObject:temp];


            NSLog(@"Print it %@%s",temp,__FUNCTION__);



-(void)viewDidLoad

            [super viewDidLoad];
            [NSThread detachNewThreadSelector:@selector(Sample) toTarget:self withObject:@"NSSstint"];
            // Do any additional setup after loading the view, typically from a nib.

编辑:

我知道如果我将自动释放消息传递给对象,我将泄漏内存。 我将以下方法实现用于示例方法调用: 即使现在我也没有收到以下消息:

*** __NSAutoreleaseNoPool(): object 0x167ba4 autoreleased without a pool in place - just leaking ***


 -(void)Sample

    NSLog(@"Sample");
    NSString *temp=[[NSString alloc] initWithFormat:@"Sample"];

    NSArray *tempAray = [NSArray arrayWithObject:temp];
    [tempAray retain];
    [tempAray autorelease];
    [temp autorelease];


    NSLog(@"Print it %@%s",temp,__FUNCTION__);


【问题讨论】:

【参考方案1】:

它不会产生错误,因为它只会为您提供日志消息。如果您在新线程中自动释放对象而不创建自动释放池,您将收到大量消息,例如

*** __NSAutoreleaseNoPool(): object 0x167ba4 autoreleased without a pool in place - just leaking ***

但这与抛出 NSExcpetion 相同。此外,您可能从中获得的“它运行良好”的印象是错误的:您会泄漏内存,并且您的应用偶尔会因内存不足而崩溃。

【讨论】:

感谢 H2CO3。我已经更新了我的问题。你能解释一下为什么我没有收到你提到的消息吗?

以上是关于为啥不使用 autoreleasepool 块不会抛出错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥@autoreleasepool 不起作用

为什么SDWebImage在decodeImageWithImage方法中使用@autoreleasepool块?

`objc_autoreleasePoolPush()` 和 `objc_autoreleasePoolPop()` 函数和 `@autoreleasepool` 块

如何了解 iOS 上 autoreleasepools 的内容?

NSAutoreleasePool 和 @autoreleasepool 块有啥区别?

为啥在块外设置时,`scheduledTimer` 会正确触发,而不是在块内?