#import <Foundation/Foundation.h>
@interface ThreadingServer : NSObject
@property (atomic) BOOL isContinue;
@property (atomic) BOOL isRun;
@end
@implementation ThreadingServer
{
dispatch_group_t group;
}
@synthesize isContinue;
@synthesize isRun;
- (id)init
{
self = [super init];
if (self)
{
NSLog(@"init");
group = dispatch_group_create();
self.isContinue = YES;
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
self.isRun = YES;
@autoreleasepool {
while (self.isContinue) {
@autoreleasepool
{
NSLog(@"do something : %p", self);
[NSThread sleepForTimeInterval:1.0];
}
@autoreleasepool { NSLog(@"%d", (int)CFGetRetainCount((__bridge void *)self)); }
}
}
self.isRun = NO;
});
@autoreleasepool { NSLog(@"%d", (int)CFGetRetainCount((__bridge void *)self)); }
}
return self;
}
- (void)dealloc
{
dispatch_release(group);
NSLog(@"Exit ThreadingServer dealloc");
}
@end
@interface ThreadingServerForOutsideClass : NSObject
@end
@interface ThreadingServerForOutsideClass ()
@property (strong,nonatomic) ThreadingServer *server;
@end
@implementation ThreadingServerForOutsideClass
@synthesize server = _server;
- (id)init
{
if( (self = [super init]) == nil )
return nil;
self.server = [[ThreadingServer alloc] init];
return self;
}
- (void)dealloc
{
_server.isContinue = NO;
self.server = nil;
NSLog( @"Exit ThreadingServerForOutsideClass dealloc" );
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool
{
ThreadingServerForOutsideClass *server = [[ThreadingServerForOutsideClass alloc] init];
[NSThread sleepForTimeInterval:3.0];
}
[NSThread sleepForTimeInterval:8.0];
return 0;
}