Selaa lähdekoodia

VLCKit: migrate VLCLibrary to ARC

Enhanced +sharedLibrary thread safety
Fixes an issue with +sharedInstance not calling +sharedLibrary first
Removed tests on sharedInstance from -dealloc as shared instance can't be dealloc'd by nature (local static strong reference)

Signed-off-by: Felix Paul Kühne <fkuehne@videolan.org>
Florent Pillet 11 vuotta sitten
vanhempi
commit
7a2950d8a0
1 muutettua tiedostoa jossa 34 lisäystä ja 74 poistoa
  1. 34 74
      Sources/VLCLibrary.m

+ 34 - 74
Sources/VLCLibrary.m

@@ -37,43 +37,33 @@
 #include <vlc/libvlc_structures.h>
 
 static VLCLibrary * sharedLibrary = nil;
-static void * sharedInstance = nil;
 
 @interface VLCLibrary()
-{
-    void *instance;
-}
+
+@property (nonatomic, assign) void *instance;
 
 @end
 
 @implementation VLCLibrary
+
 + (VLCLibrary *)sharedLibrary
 {
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         sharedLibrary = [[self alloc] init];
-        sharedInstance = sharedLibrary.instance;
     });
     return sharedLibrary;
 }
 
++ (void *)sharedInstance
+{
+    return [self sharedLibrary].instance;
+}
+
 - (id)init
 {
     if (self = [super init]) {
-        NSArray *vlcParams = [self _defaultOptions];
-
-        NSUInteger paramNum = 0;
-        NSUInteger count = [vlcParams count];
-        const char *lib_vlc_params[count];
-        while (paramNum < count) {
-            NSString *vlcParam = vlcParams[paramNum];
-            lib_vlc_params[paramNum] = [vlcParam cStringUsingEncoding:NSASCIIStringEncoding];
-            paramNum++;
-        }
-        unsigned argc = sizeof(lib_vlc_params)/sizeof(lib_vlc_params[0]);
-        instance = libvlc_new(argc, lib_vlc_params);
-        libvlc_retain(instance);
-        NSAssert(instance, @"libvlc failed to initialize");
+        [self prepareInstanceWithOptions:nil];
     }
     return self;
 }
@@ -81,35 +71,29 @@ static void * sharedInstance = nil;
 - (id)initWithOptions:(NSArray*)options
 {
     if (self = [super init]) {
-        NSArray *vlcParams = [self _defaultOptions];
-
-        NSUInteger paramNum = 0;
-        NSUInteger count = [vlcParams count];
-        NSUInteger optionsCount = [options count];
-        const char *lib_vlc_params[count+optionsCount];
-
-        /* add default stuff */
-        while (paramNum < count) {
-            NSString *vlcParam = vlcParams[paramNum];
-            lib_vlc_params[paramNum] = [vlcParam cStringUsingEncoding:NSASCIIStringEncoding];
-            paramNum++;
-        }
-
-        /* add requested options */
-        NSUInteger optionNum = 0;
-        while (optionNum < optionsCount) {
-            NSString *vlcParam = options[optionNum];
-            lib_vlc_params[paramNum + optionNum] = [vlcParam cStringUsingEncoding:NSASCIIStringEncoding];
-            optionNum++;
-        }
-        unsigned argc = sizeof(lib_vlc_params)/sizeof(lib_vlc_params[0]);
-        instance = libvlc_new(argc, lib_vlc_params);
-        libvlc_retain(instance);
-        NSAssert(instance, @"libvlc failed to initialize");
+        [self prepareInstanceWithOptions:options];
     }
     return self;
 }
 
+- (void)prepareInstanceWithOptions:(NSArray *)options
+{
+    NSArray *allOptions = options ? [[self _defaultOptions] arrayByAddingObjectsFromArray:options] : [self _defaultOptions];
+
+    NSUInteger paramNum = 0;
+    NSUInteger count = allOptions.count;
+    const char *lib_vlc_params[count];
+    while (paramNum < count) {
+        lib_vlc_params[paramNum] = [allOptions[paramNum] cStringUsingEncoding:NSASCIIStringEncoding];
+        paramNum++;
+    }
+    _instance = libvlc_new(count, lib_vlc_params);
+    if (_instance)
+        libvlc_retain(_instance);
+
+    NSAssert(_instance, @"libvlc failed to initialize");
+}
+
 - (NSArray *)_defaultOptions
 {
     NSArray *vlcParams;
@@ -163,44 +147,20 @@ static void * sharedInstance = nil;
 
 - (void)setHumanReadableName:(NSString *)readableName withHTTPUserAgent:(NSString *)userAgent
 {
-    if (instance)
-        libvlc_set_user_agent(instance, [readableName UTF8String], [userAgent UTF8String]);
+    if (_instance)
+        libvlc_set_user_agent(_instance, [readableName UTF8String], [userAgent UTF8String]);
 }
 
 - (void)setApplicationIdentifier:(NSString *)identifier withVersion:(NSString *)version andApplicationIconName:(NSString *)icon
 {
-    if (instance)
-        libvlc_set_app_id(instance, [identifier UTF8String], [version UTF8String], [icon UTF8String]);
+    if (_instance)
+        libvlc_set_app_id(_instance, [identifier UTF8String], [version UTF8String], [icon UTF8String]);
 }
 
 - (void)dealloc
 {
-    if (instance)
-        libvlc_release(instance);
-
-    if (self == sharedLibrary) {
-        sharedLibrary = nil;
-        libvlc_release(sharedInstance);
-        sharedInstance = nil;
-    }
-
+    if (_instance)
+        libvlc_release(_instance);
 }
 
 @end
-
-@implementation VLCLibrary (VLCLibVLCBridging)
-+ (void *)sharedInstance
-{
-    NSAssert(sharedInstance, @"shared library doesn't have an instance");
-
-    return sharedInstance;
-}
-
-- (void *)instance
-{
-    NSAssert(instance, @"library doesn't have an instance");
-
-    return instance;
-}
-@end
-