blob: 56631d1b01b7e09de27138caf08253a9731348b9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include <QTest>
#include <QtCore/private/qcore_mac_p.h>
#include <Foundation/Foundation.h>
class tst_QMacAutoreleasePool : public QObject
{
Q_OBJECT
private slots:
void noPool();
void rootLevelPool();
void stackAllocatedPool();
};
static id lastDeallocedObject = nil;
@interface DeallocTracker : NSObject @end
@implementation DeallocTracker
-(void)dealloc
{
lastDeallocedObject = self;
[super dealloc];
}
@end
void tst_QMacAutoreleasePool::noPool()
{
// No pool, will not be released, but should not crash
[[[DeallocTracker alloc] init] autorelease];
}
void tst_QMacAutoreleasePool::rootLevelPool()
{
// The root level case, no NSAutoreleasePool since we're not in the main
// runloop, and objects autoreleased as part of main.
NSObject *allocedObject = nil;
{
QMacAutoReleasePool qtPool;
allocedObject = [[[DeallocTracker alloc] init] autorelease];
}
QCOMPARE(lastDeallocedObject, allocedObject);
}
void tst_QMacAutoreleasePool::stackAllocatedPool()
{
// The normal case, other pools surrounding our pool, draining
// our pool before any other pool.
NSObject *allocedObject = nil;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
{
QMacAutoReleasePool qtPool;
allocedObject = [[[DeallocTracker alloc] init] autorelease];
}
QCOMPARE(lastDeallocedObject, allocedObject);
[pool drain];
}
QTEST_APPLESS_MAIN(tst_QMacAutoreleasePool)
#include "tst_qmacautoreleasepool.moc"
|