It seems that if I compile DeeplabV3FP16 model as objc class, the memory leak disappears, while as swift class, the memory leaks.
My comparison codes as below
Objc version
Code Block @implementation ViewController |
|
- (void)dealloc |
{ |
[DeepLabV3Generator destroy]; |
} |
|
- (void)viewDidLoad { |
[super viewDidLoad]; |
// Do any additional setup after loading the view. |
|
|
NSString *name = [NSString stringWithFormat:@"DeeplabV3-%tu", nameIndex]; |
nameIndex ++; |
CIImage *image = [[CIImage alloc]initWithImage:[UIImage imageNamed:name]]; |
CVPixelBufferRef pb; |
CVPixelBufferCreate(kCFAllocatorDefault, image.extent.size.width, image.extent.size.height, kCVPixelFormatType_32BGRA, NULL, &pb); |
[CIContext.context render:image toCVPixelBuffer:pb]; |
|
[DeepLabV3Generator.si loadDeeplabV3From:pb]; |
|
CVPixelBufferRelease(pb); |
} |
Code Block #import "DeepLabV3Generator.h" |
|
@implementation DeepLabV3Generator |
static DeepLabV3Generator* sharedInstance = nil; |
|
+(DeepLabV3Generator*)si{ |
if(sharedInstance != nil){ |
return sharedInstance; |
} |
static dispatch_once_t onceToken; |
dispatch_once(&onceToken, ^{ |
sharedInstance = [[DeepLabV3Generator alloc]init]; |
}); |
|
return sharedInstance; |
} |
|
+(void)destroy{ |
sharedInstance = nil; |
} |
|
- (instancetype)init |
{ |
self = [super init]; |
if (self) { |
NSError *error = nil; |
MLModelConfiguration *config = [MLModelConfiguration new]; |
self.v3 = [[DeepLabV3FP16 alloc]initWithConfiguration:config error:&error]; |
} |
return self; |
} |
|
-(MLMultiArray *)loadDeeplabV3From:(CVPixelBufferRef)pixeBuffer{ |
NSError *error = nil; |
DeepLabV3FP16Output *output = [_v3 predictionFromImage:pixeBuffer error:&error]; |
if (error) { |
NSLog(@"error %@",error.localizedDescription); |
} |
return output.semanticPredictions; |
} |
Swift verisoin
Code Block @objc class DeepLabV3Generator: NSObject { |
private static var sharedInstance : DeepLabV3Generator? |
|
@objc class func si() -> DeepLabV3Generator { // change class to final to prevent override |
guard let uwShared = sharedInstance else { |
sharedInstance = DeepLabV3Generator() |
return sharedInstance! |
} |
return uwShared |
} |
|
@objc class func destroy() { |
sharedInstance = nil |
} |
|
let v3 : DeepLabV3FP16 |
|
private override init() { |
let config = MLModelConfiguration() |
config.computeUnits = .all |
v3 = try! DeepLabV3FP16(configuration: config) |
} |
|
@objc func loadDeeplabV3(from pixelBuffer:CVPixelBuffer) -> MLMultiArray? { |
let output = try! v3 .prediction(image: pixelBuffer) |
return output.semanticPredictions |
} |
|
} |