You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
1.5 KiB
Objective-C

#include "Test.h"
#include <stdio.h>
static BOOL called;
@interface AllUnsafe : Test @end
@implementation AllUnsafe
- (id)retain
{
return self;
}
- (void)release {}
- (id)autorelease
{
return self;
}
@end
@interface Retain : AllUnsafe @end
@implementation Retain
- (id)retain
{
called = YES;
return self;
}
@end
@interface RetainSafe : AllUnsafe @end
@implementation RetainSafe
- (id)retain
{
return self;
}
- (void)_ARCCompliantRetainRelease {}
@end
@interface Release : AllUnsafe @end
@implementation Release
- (void)release
{
called = YES;
}
@end
@interface ReleaseSafe : AllUnsafe @end
@implementation ReleaseSafe
- (void)release
{
}
- (void)_ARCCompliantRetainRelease {}
@end
@interface Autorelease : AllUnsafe @end
@implementation Autorelease
- (id)autorelease
{
called = YES;
return self;
}
@end
@interface AutoreleaseSafe : AllUnsafe @end
@implementation AutoreleaseSafe
- (id)autorelease
{
return self;
}
- (void)_ARCCompliantRetainRelease {}
@end
void check(id obj, BOOL expected)
{
fprintf(stderr, "Checking %s\n", class_getName(object_getClass(obj)));
}
int main()
{
called = NO;
objc_retain([Retain new]);
assert(called == YES);
called = NO;
objc_retain([RetainSafe new]);
assert(called == NO);
called = NO;
objc_release([Release new]);
assert(called == YES);
called = NO;
objc_release([ReleaseSafe new]);
assert(called == NO);
called = NO;
objc_autorelease([Autorelease new]);
assert(called == YES);
called = NO;
objc_autorelease([AutoreleaseSafe new]);
assert(called == NO);
return 0;
}