Просмотр исходного кода

Converts the library to ARC and therefore changed the struct message_t into a class and adjusted the code using message_t

Thanks to Steven Kabbes & Tammo Freese for the help and insights
Carola Nitz 11 лет назад
Родитель
Сommit
6ea28be83d

+ 3 - 3
Headers/Public/VLCLibrary.h

@@ -59,21 +59,21 @@
  * \return The library version example "0.9.0-git Grishenko".
  */
 
-@property (readonly) NSString * version;
+@property (readonly, copy) NSString * version;
 
 /**
  * Returns the compiler used to build the libvlc binary
  * \return The compiler version string.
  */
 
-@property (readonly) NSString * compiler;
+@property (readonly, copy) NSString * compiler;
 
 /**
  * Returns the library's changeset
  * \return The library version example "adfee99".
  */
 
-@property (readonly) NSString * changeset;
+@property (readonly, copy) NSString * changeset;
 
 /**
  * sets the application name and HTTP User Agend

+ 6 - 6
Headers/Public/VLCMedia.h

@@ -128,7 +128,7 @@ typedef NSInteger VLCMediaState;
     VLCMediaList *        subitems;          //< Sub list of items
     VLCTime *             length;            //< Cached duration of the media
     NSMutableDictionary * metaDictionary;    //< Meta data storage
-    id                    delegate;          //< Delegate object
+    id                    __weak delegate;          //< Delegate object
     BOOL                  isArtFetched;      //< Value used to determine of the artwork has been parsed
     BOOL                  areOthersMetaFetched; //< Value used to determine of the other meta has been parsed
     BOOL                  isArtURLFetched;   //< Value used to determine of the other meta has been preparsed
@@ -199,14 +199,14 @@ typedef NSInteger VLCMediaState;
 /**
  * Receiver's delegate.
  */
-@property (assign) id delegate;
+@property (weak) id delegate;
 
 /**
  * A VLCTime object describing the length of the media resource, only if it is
  * available.  Use lengthWaitUntilDate: to wait for a specified length of time.
  * \see lengthWaitUntilDate
  */
-@property (retain, readonly) VLCTime * length;
+@property (readonly) VLCTime * length;
 
 /**
  * Returns a VLCTime object describing the length of the media resource,
@@ -226,12 +226,12 @@ typedef NSInteger VLCMediaState;
 /**
  * The URL for the receiver's media resource.
  */
-@property (retain, readonly) NSURL * url;
+@property (readonly) NSURL * url;
 
 /**
  * The receiver's sub list.
  */
-@property (retain, readonly) VLCMediaList * subitems;
+@property (readonly) VLCMediaList * subitems;
 
 /**
  * get meta property for key
@@ -258,7 +258,7 @@ typedef NSInteger VLCMediaState;
 /**
  * The receiver's meta data as a NSDictionary object.
  */
-@property (retain, readonly) NSDictionary * metaDictionary;
+@property (readonly) NSDictionary * metaDictionary;
 
 /**
  * The receiver's state, such as Playing, Error, NothingSpecial, Buffering.

+ 2 - 2
Headers/Public/VLCMediaDiscoverer.h

@@ -56,12 +56,12 @@
 /**
  * TODO: Documentation VLCMediaDiscoverer.discoveredMedia
  */
-@property (readonly) VLCMediaList * discoveredMedia;
+@property (weak, readonly) VLCMediaList * discoveredMedia;
 
 /**
  * TODO: Documentation VLCMediaDiscoverer.localizedName
  */
-@property (readonly) NSString * localizedName;
+@property (readonly, copy) NSString * localizedName;
 
 /**
  * TODO: Documentation VLCMediaDiscoverer.isRunning

+ 2 - 2
Headers/Public/VLCMediaList.h

@@ -54,7 +54,7 @@ extern NSString *const VLCMediaListItemDeleted;
 @interface VLCMediaList : NSObject
 {
     void * p_mlist;                                 //< Internal instance of media list
-    id <VLCMediaListDelegate,NSObject> delegate;    //< Delegate object
+    id <VLCMediaListDelegate,NSObject> __weak delegate;    //< Delegate object
     /* We need that private copy because of Cocoa Bindings, that need to be working on first thread */
     NSMutableArray * cachedMedia;                   //< Private copy of media objects.
 }
@@ -106,7 +106,7 @@ extern NSString *const VLCMediaListItemDeleted;
 /**
  * TODO: Documentation VLCMediaList.delegate
  */
-@property (assign) id delegate;
+@property (weak) id delegate;
 
 /**
  * TODO: Documentation VLCMediaList.isReadOnly

+ 3 - 3
Headers/Public/VLCMediaListPlayer.h

@@ -44,15 +44,15 @@ typedef NS_ENUM(NSInteger, VLCRepeatMode) {
     VLCRepeatMode _repeatMode;
 }
 
-@property (readwrite, retain) VLCMediaList *mediaList;
+@property (readwrite) VLCMediaList *mediaList;
 
 /**
  * rootMedia - Use this method to play a media and its subitems.
  * This will erase mediaList.
  * Setting mediaList will erase rootMedia.
  */
-@property (readwrite, retain) VLCMedia *rootMedia;
-@property (readonly, retain) VLCMediaPlayer *mediaPlayer;
+@property (readwrite) VLCMedia *rootMedia;
+@property (readonly) VLCMediaPlayer *mediaPlayer;
 
 - (id)initWithOptions:(NSArray *)options;
 

+ 4 - 4
Headers/Public/VLCMediaPlayer.h

@@ -116,7 +116,7 @@ extern NSString * VLCMediaPlayerStateToString(VLCMediaPlayerState state);
 - (void)setVideoLayer:(VLCVideoLayer *)aVideoLayer;
 #endif
 
-@property (retain) id drawable; /* The videoView or videoLayer */
+@property (strong) id drawable; /* The videoView or videoLayer */
 
 /**
  * Set/Get current video aspect ratio.
@@ -216,7 +216,7 @@ extern NSString * VLCMediaPlayerStateToString(VLCMediaPlayerState state);
  */
 @property float rate;
 
-@property (readonly) VLCAudio * audio;
+@property (weak, readonly) VLCAudio * audio;
 
 /* Video Information */
 /**
@@ -252,7 +252,7 @@ extern NSString * VLCMediaPlayerStateToString(VLCMediaPlayerState state);
  */
 - (VLCTime *)time;
 
-@property (readonly) VLCTime *remainingTime;
+@property (weak, readonly) VLCTime *remainingTime;
 
 /**
  * Frames per second
@@ -415,7 +415,7 @@ extern NSString * VLCMediaPlayerStateToString(VLCMediaPlayerState state);
  *
  * \return array of equalizer profiles
  */
-@property (readonly) NSArray *equalizerProfiles;
+@property (weak, readonly) NSArray *equalizerProfiles;
 
 /**
  * Re-set the equalizer to a profile retrieved from the list

+ 3 - 3
Headers/Public/VLCMediaThumbnailer.h

@@ -30,7 +30,7 @@
 @protocol VLCMediaThumbnailerDelegate;
 
 @interface VLCMediaThumbnailer : NSObject {
-    id<VLCMediaThumbnailerDelegate> _delegate;
+    id<VLCMediaThumbnailerDelegate> __weak _delegate;
     VLCMedia *_media;
     void *_mp;
     CGImageRef _thumbnail;
@@ -49,8 +49,8 @@
 + (VLCMediaThumbnailer *)thumbnailerWithMedia:(VLCMedia *)media delegate:(id<VLCMediaThumbnailerDelegate>)delegate andVLCLibrary:(VLCLibrary *)library;
 - (void)fetchThumbnail;
 
-@property (readwrite, assign) id<VLCMediaThumbnailerDelegate> delegate;
-@property (readwrite, retain) VLCMedia *media;
+@property (readwrite, weak) id<VLCMediaThumbnailerDelegate> delegate;
+@property (readwrite) VLCMedia *media;
 @property (readwrite, assign) CGImageRef thumbnail;
 @property (readwrite) void * libVLCinstance;
 

+ 4 - 4
Headers/Public/VLCTime.h

@@ -42,10 +42,10 @@
 - (id)initWithInt:(int)aInt;
 
 /* Properties */
-@property (readonly) NSNumber * numberValue;
-@property (readonly) NSString * stringValue;
-@property (readonly) NSString * verboseStringValue;
-@property (readonly) NSString * minuteStringValue;
+@property (weak, readonly) NSNumber * numberValue;
+@property (readonly, copy) NSString * stringValue;
+@property (readonly, copy) NSString * verboseStringValue;
+@property (readonly, copy) NSString * minuteStringValue;
 @property (readonly) int intValue;
 
 /* Comparitors */

+ 2 - 0
MobileVLCKit.xcodeproj/project.pbxproj

@@ -302,6 +302,7 @@
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+				CLANG_ENABLE_OBJC_ARC = YES;
 				COPY_PHASE_STRIP = NO;
 				DSTROOT = /tmp/MobileVLCKit.dst;
 				GCC_DYNAMIC_NO_PIC = NO;
@@ -323,6 +324,7 @@
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
+				CLANG_ENABLE_OBJC_ARC = YES;
 				DSTROOT = /tmp/MobileVLCKit.dst;
 				ENABLE_NS_ASSERTIONS = NO;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;

+ 0 - 1
Sources/VLCAudio.m

@@ -63,7 +63,6 @@ NSString *const VLCMediaPlayerVolumeChanged = @"VLCMediaPlayerVolumeChanged";
 - (void) dealloc
 {
     libvlc_media_player_release([self instance]);
-    [super dealloc];
 }
 
 - (void)setMute:(BOOL)value

+ 150 - 169
Sources/VLCEventManager.m

@@ -38,130 +38,133 @@ typedef enum
 /**
  * Data structured used to enqueue messages onto the queue.
  */
-typedef struct {
-    id target;                      //< Target object that should receive the message (retained until method is called).
-    SEL sel;                        //< A selector that identifies the message to be sent to the target.
-    union u                         //< Object could either be a VLCNotification or other.
-    {
-        NSString * name;            //< Name to be used for NSNotification
-        id object;                  //< Object argument to pass to the target via the selector.
-    } u;
-    message_type_t type;            //< Type of queued message.
-} message_t;
+@interface message_t : NSObject
+
+@property (nonatomic) id target;    //< Target object that should receive the message (retained until method is called).
+@property (nonatomic) SEL sel;      //< A selector that identifies the message to be sent to the target.
+@property (nonatomic, copy) NSString * name;           //< Name to be used for NSNotification
+@property (nonatomic) id object;                  //< Object argument to pass to the target via the selector.
+@property (nonatomic) message_type_t type;            //< Type of queued message.
+
+@end
+
+@implementation message_t
+
+- (BOOL)isEqual:(id)object
+{
+    if (![object isKindOfClass:[message_t class]]) return NO;
+
+    message_t *otherObject = object;
+    BOOL notificatonMatches =
+        (otherObject.type == VLCNotification              && [otherObject.name isEqualToString:self.name]) ||
+        (otherObject.type == VLCObjectMethodWithArrayArg  && [otherObject.object isEqual:self.object]) ||
+        (otherObject.type == VLCObjectMethodWithObjectArg && [otherObject.object isEqual:self.object]);
+
+    return [otherObject.target isEqual:_target] &&
+            otherObject.sel == self.sel         &&
+            otherObject.type == self.type       &&
+            notificatonMatches;
+}
+
+@end
 
 @interface VLCEventManager (Private)
-- (void)callDelegateOfObjectAndSendNotificationWithArgs:(NSData*)data;
-- (void)callObjectMethodWithArgs:(NSData*)data;
-- (void)callDelegateOfObject:(id) aTarget withDelegateMethod:(SEL)aSelector withNotificationName:(NSString *)aNotificationName;
+- (void)callDelegateOfObjectAndSendNotificationWithArgs:(message_t *)message;
+- (void)callObjectMethodWithArgs:(message_t *)message;
+- (void)callDelegateOfObject:(id)aTarget withDelegateMethod:(SEL)aSelector withNotificationName:(NSString *)aNotificationName;
 - (pthread_cond_t *)signalData;
 - (pthread_mutex_t *)queueLock;
 - (NSMutableArray *)messageQueue;
 - (NSMutableArray *)pendingMessagesOnMainThread;
 - (NSLock *)pendingMessagesLock;
 
-- (void)addMessageToHandleOnMainThread:(NSData *)messageAsData;
+- (void)addMessageToHandleOnMainThread:(message_t *)message;
 @end
 
 /**
- * Provides a function for the main entry point for the dispatch thread.  It dispatches any messages that is queued.
+ * Provides a function for the main entry point for the dispatch thread. It dispatches any messages that is queued.
  * \param user_data Pointer to the VLCEventManager instance that instiated this thread.
  */
 static void * EventDispatcherMainLoop(void * user_data)
 {
-    VLCEventManager * self = user_data;
+    VLCEventManager * self = (__bridge VLCEventManager *)(user_data);
 
     for (;;) {
-        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-        message_t * message, * message_newer = NULL;
-        NSData * dataMessage;
-
-        /* Sleep a bit not to flood the interface */
-        usleep(300);
-
-        /* Wait for some data */
-
-        pthread_mutex_lock([self queueLock]);
-        /* Wait until we have something on the queue */
-        while ([[self messageQueue] count] <= 0)
-            pthread_cond_wait([self signalData], [self queueLock]);
-
-        //if ([[self messageQueue] count] % 100 == 0 || [[self messageQueue] count] < 100)
-          //  VKLog(@"[EVENT_MANAGER] On the stack we have %d elements", [[self messageQueue] count]);
-
-        /* Get the first object off the queue. */
-        dataMessage = [[[self messageQueue] lastObject] retain];    // Released in 'call'
-        [[self messageQueue] removeLastObject];
-        message = (message_t *)[dataMessage bytes];
-
-        /* Remove duplicate notifications (keep the newest one). */
-        if (message->type == VLCNotification) {
-            NSInteger last_match_msg = -1;
-            for (NSInteger i = [[self messageQueue] count]-1; i >= 0; i-- ) {
-                message_newer = (message_t *)[(NSData *)[self messageQueue][i] bytes];
-                if (message_newer->type == VLCNotification &&
-                    message_newer->target == message->target &&
-                    [message_newer->u.name isEqualToString:message->u.name]) {
-                    if (last_match_msg >= 0) {
-                        message_t * msg = (message_t *)[(NSData *)[self messageQueue][last_match_msg] bytes];
-                        [msg->u.name release];
-                        [[self messageQueue] removeObjectAtIndex:last_match_msg];
+            message_t * message, * message_newer = NULL;
+
+            /* Sleep a bit not to flood the interface */
+            usleep(300);
+
+            /* Wait for some data */
+
+            pthread_mutex_lock([self queueLock]);
+            /* Wait until we have something on the queue */
+            while ([[self messageQueue] count] <= 0)
+                pthread_cond_wait([self signalData], [self queueLock]);
+
+            /* Get the first object off the queue. */
+            message = [[self messageQueue] lastObject];    // Released in 'call'
+            [[self messageQueue] removeLastObject];
+
+            /* Remove duplicate notifications (keep the newest one). */
+            if (message.type == VLCNotification) {
+                NSInteger last_match_msg = -1;
+                for (NSInteger i = [[self messageQueue] count]-1; i >= 0; i--) {
+                    message_newer = [self messageQueue][i];
+                    if (message_newer.type == VLCNotification &&
+                        message_newer.target == message.target &&
+                        [message_newer.name isEqualToString:message.name]) {
+                        if (last_match_msg >= 0) {
+                            [[self messageQueue] removeObjectAtIndex:last_match_msg];
+                        }
+                        last_match_msg = i;
                     }
-                    last_match_msg = i;
                 }
-            }
-            if (last_match_msg >= 0) {
-                // newer notification detected, ignore current one
-                [message->u.name release];
-                [dataMessage release];
-                [pool release];
-                pthread_mutex_unlock([self queueLock]);
-                continue;
-            }
-        } else if (message->type == VLCObjectMethodWithArrayArg) {
-            NSMutableArray * newArg = nil;
-
-            /* Collapse messages that takes array arg by sending one bigger array */
-            for (NSInteger i = [[self messageQueue] count] - 1; i >= 0; i--) {
-                message_newer = (message_t *)[(NSData *)[self messageQueue][i] bytes];
-                if (message_newer->type == VLCObjectMethodWithArrayArg &&
-                    message_newer->target == message->target &&
-                    message_newer->sel == message->sel) {
-                    if (!newArg) {
-                        newArg = [NSMutableArray arrayWithArray:message->u.object];
-                        [message->u.object release];
+                if (last_match_msg >= 0) {
+                    // newer notification detected, ignore current one
+                    pthread_mutex_unlock([self queueLock]);
+                    continue;
+                }
+            } else if (message.type == VLCObjectMethodWithArrayArg) {
+                NSMutableArray * newArg = nil;
+
+                /* Collapse messages that takes array arg by sending one bigger array */
+                for (NSInteger i = [[self messageQueue] count] - 1; i >= 0; i--) {
+                    message_newer = [self messageQueue][i];
+                    if (message_newer.type == VLCObjectMethodWithArrayArg &&
+                        message_newer.target == message.target &&
+                        message_newer.sel == message.sel) {
+                        if (!newArg) {
+                            newArg = [NSMutableArray arrayWithArray:message.object];
+                        }
+
+                        [newArg addObjectsFromArray:message_newer.object];
+                        [[self messageQueue] removeObjectAtIndex:i];
                     }
-
-                    [newArg addObjectsFromArray:message_newer->u.object];
-                    [message_newer->u.object release];
-                    [[self messageQueue] removeObjectAtIndex:i];
+                    /* It shouldn be a good idea not to collapse event with other kind of event in-between.
+                     * This could be particulary problematic when the same object receive two related events
+                     * (for instance Added and Removed).
+                     * Ignore for now only if target is the same */
+                    else if (message_newer.target == message.target)
+                        break;
                 }
-                /* It shouldn be a good idea not to collapse event with other kind of event in-between.
-                 * This could be particulary problematic when the same object receive two related events
-                 * (for instance Added and Removed).
-                 * Ignore for now only if target is the same */
-                else if (message_newer->target == message->target)
-                    break;
-            }
 
-            if (newArg)
-                message->u.object = [newArg retain];
+                if (newArg)
+                    message.object = newArg;
+            }
+            [self addMessageToHandleOnMainThread:message];
+
+            pthread_mutex_unlock([self queueLock]);
+
+            if (message.type == VLCNotification)
+                [self performSelectorOnMainThread:@selector(callDelegateOfObjectAndSendNotificationWithArgs:)
+                                       withObject:message
+                                    waitUntilDone: NO];
+            else
+                [self performSelectorOnMainThread:@selector(callObjectMethodWithArgs:)
+                                       withObject:message
+                                    waitUntilDone: YES];
         }
-
-        [self addMessageToHandleOnMainThread:dataMessage];
-
-        pthread_mutex_unlock([self queueLock]);
-
-        if (message->type == VLCNotification)
-            [self performSelectorOnMainThread:@selector(callDelegateOfObjectAndSendNotificationWithArgs:)
-                                   withObject:dataMessage
-                                waitUntilDone: NO];
-        else
-            [self performSelectorOnMainThread:@selector(callObjectMethodWithArgs:)
-                                   withObject:dataMessage
-                                waitUntilDone: YES];
-
-        [pool release];
-    }
     return nil;
 }
 
@@ -190,13 +193,13 @@ static void * EventDispatcherMainLoop(void * user_data)
             NSAssert([NSThread isMultiThreaded], @"Can't put Cocoa in multithreaded mode");
         }
 
-        messageQueue = [[NSMutableArray alloc] initWithCapacity:10];
-        pendingMessagesOnMainThread = [[NSMutableArray alloc] initWithCapacity:10];
+        messageQueue = [NSMutableArray new];
+        pendingMessagesOnMainThread = [NSMutableArray new];
         pendingMessagesLock = [[NSLock alloc] init];
 
         pthread_mutex_init(&queueLock, NULL);
         pthread_cond_init(&signalData, NULL);
-        pthread_create(&dispatcherThread, NULL, EventDispatcherMainLoop, self);
+        pthread_create(&dispatcherThread, NULL, EventDispatcherMainLoop, (__bridge void *)(self));
     }
     return self;
 }
@@ -205,51 +208,39 @@ static void * EventDispatcherMainLoop(void * user_data)
 {
     pthread_kill(dispatcherThread, SIGKILL);
     pthread_join(dispatcherThread, NULL);
-
-    [messageQueue release];
-    [pendingMessagesLock release];
-    [pendingMessagesOnMainThread release];
-    [super dealloc];
 }
 
 - (void)callOnMainThreadDelegateOfObject:(id)aTarget withDelegateMethod:(SEL)aSelector withNotificationName:(NSString *)aNotificationName
 {
     /* Don't send on main thread before this gets sorted out */
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-
-    message_t message =
-    {
-        aTarget,
-        aSelector,
-        [aNotificationName retain],
-        VLCNotification
-    };
+    @autoreleasepool {
+        message_t *message = [message_t new];
+        message.sel = aSelector;
+        message.target = aTarget;
+        message.name = aNotificationName;
+        message.type = VLCNotification;
 
-    pthread_mutex_lock([self queueLock]);
-    [[self messageQueue] insertObject:[NSData dataWithBytes:&message length:sizeof(message_t)] atIndex:0];
-    pthread_cond_signal([self signalData]);
-    pthread_mutex_unlock([self queueLock]);
-
-    [pool release];
+        pthread_mutex_lock([self queueLock]);
+        [[self messageQueue] insertObject:message atIndex:0];
+        pthread_cond_signal([self signalData]);
+        pthread_mutex_unlock([self queueLock]);
+    }
 }
 
 - (void)callOnMainThreadObject:(id)aTarget withMethod:(SEL)aSelector withArgumentAsObject:(id)arg
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    message_t message =
-    {
-        aTarget,
-        aSelector,
-        [arg retain],
-        [arg isKindOfClass:[NSArray class]] ? VLCObjectMethodWithArrayArg : VLCObjectMethodWithObjectArg
-    };
+    @autoreleasepool {
+        message_t *message = [message_t new];
+        message.sel = aSelector;
+        message.target = aTarget;
+        message.object = arg;
+        message.type = [arg isKindOfClass:[NSArray class]] ? VLCObjectMethodWithArrayArg : VLCObjectMethodWithObjectArg;
 
-    pthread_mutex_lock([self queueLock]);
-    [[self messageQueue] insertObject:[NSData dataWithBytes:&message length:sizeof(message_t)] atIndex:0];
-    pthread_cond_signal([self signalData]);
-    pthread_mutex_unlock([self queueLock]);
-
-    [pool release];
+        pthread_mutex_lock([self queueLock]);
+        [[self messageQueue] insertObject:message atIndex:0];
+        pthread_cond_signal([self signalData]);
+        pthread_mutex_unlock([self queueLock]);
+    }
 }
 
 - (void)cancelCallToObject:(id)target
@@ -261,73 +252,63 @@ static void * EventDispatcherMainLoop(void * user_data)
 
     NSMutableArray *queue = [self messageQueue];
     for (NSInteger i = [queue count] - 1; i >= 0; i--) {
-        NSData *data = queue[i];
-        message_t *message = (message_t *)[data bytes];
-        if (message->target == target)
+        message_t *message = (message_t *)queue[i];
+        if (message.target == target)
             [queue removeObjectAtIndex:i];
     }
 
     // Remove all pending messages
     NSMutableArray *messages = pendingMessagesOnMainThread;
+    // need to interate in reverse since we are removing objects
     for (NSInteger i = [messages count] - 1; i >= 0; i--) {
-        NSData *data = messages[i];
-        message_t *message = (message_t *)[data bytes];
+        message_t *message = messages[i];
 
-        if (message->target == target)
+        if (message.target == target)
             [messages removeObjectAtIndex:i];
     }
 
     [pendingMessagesLock unlock];
     pthread_mutex_unlock([self queueLock]);
-
 }
 @end
 
 @implementation VLCEventManager (Private)
 
-- (void)addMessageToHandleOnMainThread:(NSData *)messageAsData
+- (void)addMessageToHandleOnMainThread:(message_t *)message
 {
     [pendingMessagesLock lock];
-    [pendingMessagesOnMainThread addObject:messageAsData];
+    [pendingMessagesOnMainThread addObject:message];
     [pendingMessagesLock unlock];
 
 }
 
-- (BOOL)markMessageHandledOnMainThreadIfExists:(NSData *)messageAsData
+- (BOOL)markMessageHandledOnMainThreadIfExists:(message_t *)message
 {
     [pendingMessagesLock lock];
-    BOOL cancelled = ![pendingMessagesOnMainThread containsObject:messageAsData];
-    if (!cancelled)
-        [pendingMessagesOnMainThread removeObject:messageAsData];
+    BOOL cancelled = ![pendingMessagesOnMainThread containsObject:message];
+    if (!cancelled) {
+        [pendingMessagesOnMainThread removeObject:message];
+    }
     [pendingMessagesLock unlock];
 
     return !cancelled;
 }
 
-- (void)callDelegateOfObjectAndSendNotificationWithArgs:(NSData*)data
+- (void)callDelegateOfObjectAndSendNotificationWithArgs:(message_t *)message
 {
-    message_t * message = (message_t *)[data bytes];
-
     // Check that we were not cancelled, ie, target was released
-    if ([self markMessageHandledOnMainThreadIfExists:data])
-        [self callDelegateOfObject:message->target withDelegateMethod:message->sel withNotificationName:message->u.name];
+    if ([self markMessageHandledOnMainThreadIfExists:message])
+        [self callDelegateOfObject:message.target withDelegateMethod:message.sel withNotificationName:message.name];
 
-    [message->u.name release];
-    [data release];
 }
 
-- (void)callObjectMethodWithArgs:(NSData*)data
+- (void)callObjectMethodWithArgs:(message_t *)message
 {
-    message_t * message = (message_t *)[data bytes];
-
     // Check that we were not cancelled
-    if ([self markMessageHandledOnMainThreadIfExists:data]) {
-        void (*method)(id, SEL, id) = (void (*)(id, SEL, id))[message->target methodForSelector: message->sel];
-        method(message->target, message->sel, message->u.object);
+    if ([self markMessageHandledOnMainThreadIfExists:message]) {
+        void (*method)(id, SEL, id) = (void (*)(id, SEL, id))[message.target methodForSelector: message.sel];
+        method(message.target, message.sel, message.object);
     }
-
-    [message->u.object release];
-    [data release];
 }
 
 - (void)callDelegateOfObject:(id)aTarget withDelegateMethod:(SEL)aSelector withNotificationName:(NSString *)aNotificationName
@@ -338,8 +319,8 @@ static void * EventDispatcherMainLoop(void * user_data)
     if (!delegate || ![delegate respondsToSelector:aSelector])
         return;
 
-    void (*method)(id, SEL, id) = (void (*)(id, SEL, id))[[aTarget delegate] methodForSelector: aSelector];
-    method([aTarget delegate], aSelector, [NSNotification notificationWithName:aNotificationName object:aTarget]);
+    void (*method)(id, SEL, id) = (void (*)(id, SEL, id))[delegate methodForSelector: aSelector];
+    method(delegate, aSelector, [NSNotification notificationWithName:aNotificationName object:aTarget]);
 }
 
 - (NSMutableArray *)messageQueue

+ 0 - 1
Sources/VLCLibrary.m

@@ -184,7 +184,6 @@ static void * sharedInstance = nil;
         sharedInstance = nil;
     }
 
-    [super dealloc];
 }
 
 @end

+ 52 - 58
Sources/VLCMedia.m

@@ -112,50 +112,50 @@ static inline VLCMediaState LibVLCStateToMediaState( libvlc_state_t state )
  */
 static void HandleMediaMetaChanged(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(metaChanged:)
-                                       withArgumentAsObject:[VLCMedia metaTypeToString:event->u.media_meta_changed.meta_type]];
-    [pool release];
+    @autoreleasepool {
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(metaChanged:)
+                                           withArgumentAsObject:[VLCMedia metaTypeToString:event->u.media_meta_changed.meta_type]];
+    }
 }
 
 static void HandleMediaDurationChanged(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+    @autoreleasepool {
 
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(setLength:)
-                                       withArgumentAsObject:[VLCTime timeWithNumber:
-                                           @(event->u.media_duration_changed.new_duration)]];
-    [pool release];
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(setLength:)
+                                           withArgumentAsObject:[VLCTime timeWithNumber:
+                                               @(event->u.media_duration_changed.new_duration)]];
+    }
 }
 
 static void HandleMediaStateChanged(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+    @autoreleasepool {
 
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(setStateAsNumber:)
-                                       withArgumentAsObject:@(LibVLCStateToMediaState(event->u.media_state_changed.new_state))];
-    [pool release];
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(setStateAsNumber:)
+                                           withArgumentAsObject:@(LibVLCStateToMediaState(event->u.media_state_changed.new_state))];
+    }
 }
 
 static void HandleMediaSubItemAdded(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(subItemAdded)
-                                       withArgumentAsObject:nil];
-    [pool release];
+    @autoreleasepool {
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(subItemAdded)
+                                           withArgumentAsObject:nil];
+    }
 }
 
 static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(parsedChanged:)
-                                       withArgumentAsObject:@((BOOL)event->u.media_parsed_changed.new_status)];
-    [pool release];
+    @autoreleasepool {
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(parsedChanged:)
+                                           withArgumentAsObject:@((BOOL)event->u.media_parsed_changed.new_status)];
+    }
 }
 
 
@@ -165,17 +165,17 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 @implementation VLCMedia
 + (id)mediaWithURL:(NSURL *)anURL;
 {
-    return [[[VLCMedia alloc] initWithURL:anURL] autorelease];
+    return [[VLCMedia alloc] initWithURL:anURL];
 }
 
 + (id)mediaWithPath:(NSString *)aPath;
 {
-    return [[[VLCMedia alloc] initWithPath:aPath] autorelease];
+    return [[VLCMedia alloc] initWithPath:aPath];
 }
 
 + (id)mediaAsNodeWithName:(NSString *)aName;
 {
-    return [[[VLCMedia alloc] initAsNodeWithName:aName] autorelease];
+    return [[VLCMedia alloc] initAsNodeWithName:aName];
 }
 
 - (id)initWithPath:(NSString *)aPath
@@ -224,24 +224,19 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 - (void)dealloc
 {
     libvlc_event_manager_t * p_em = libvlc_media_event_manager(p_md);
-    libvlc_event_detach(p_em, libvlc_MediaMetaChanged,     HandleMediaMetaChanged,     self);
-    libvlc_event_detach(p_em, libvlc_MediaDurationChanged, HandleMediaDurationChanged, self);
-    libvlc_event_detach(p_em, libvlc_MediaStateChanged,    HandleMediaStateChanged,    self);
-    libvlc_event_detach(p_em, libvlc_MediaSubItemAdded,    HandleMediaSubItemAdded,    self);
-    libvlc_event_detach(p_em, libvlc_MediaParsedChanged,   HandleMediaParsedChanged,   self);
+    libvlc_event_detach(p_em, libvlc_MediaMetaChanged,     HandleMediaMetaChanged,     (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaDurationChanged, HandleMediaDurationChanged, (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaStateChanged,    HandleMediaStateChanged,    (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaSubItemAdded,    HandleMediaSubItemAdded,    (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaParsedChanged,   HandleMediaParsedChanged,   (__bridge void *)(self));
     [[VLCEventManager sharedManager] cancelCallToObject:self];
 
     // Testing to see if the pointer exists is not required, if the pointer is null
     // then the release message is not sent to it.
     delegate = nil;
-    [length release];
-    [url release];
-    [subitems release];
-    [metaDictionary release];
 
     libvlc_media_release( p_md );
 
-    [super dealloc];
 }
 
 - (NSString *)description
@@ -267,12 +262,12 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
         // Try figuring out what the length is
         long long duration = libvlc_media_get_duration( p_md );
         if (duration > -1) {
-            length = [[VLCTime timeWithNumber:@(duration)] retain];
-            return [[length retain] autorelease];
+            length = [VLCTime timeWithNumber:@(duration)];
+            return length;
         }
         return [VLCTime nullTime];
     }
-    return [[length retain] autorelease];
+    return length;
 }
 
 - (VLCTime *)lengthWaitUntilDate:(NSDate *)aDate
@@ -294,7 +289,7 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
             return [self length];
     }
 
-    return [[length retain] autorelease];
+    return length;
 }
 
 - (BOOL)isParsed
@@ -712,7 +707,7 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
 
 + (id)mediaWithLibVLCMediaDescriptor:(void *)md
 {
-    return [[[VLCMedia alloc] initWithLibVLCMediaDescriptor:md] autorelease];
+    return [[VLCMedia alloc] initWithLibVLCMediaDescriptor:md];
 }
 
 - (id)initWithLibVLCMediaDescriptor:(void *)md
@@ -761,7 +756,7 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
     if (!stringToMetaDictionary) {
 #define VLCStringToMeta( name ) [NSNumber numberWithInt: libvlc_meta_##name], VLCMetaInformation##name
         stringToMetaDictionary =
-            [[NSDictionary dictionaryWithObjectsAndKeys:
+            [NSDictionary dictionaryWithObjectsAndKeys:
                 VLCStringToMeta(Title),
                 VLCStringToMeta(Artist),
                 VLCStringToMeta(Genre),
@@ -778,7 +773,7 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
                 VLCStringToMeta(Publisher),
                 VLCStringToMeta(ArtworkURL),
                 VLCStringToMeta(TrackID),
-                nil] retain];
+                nil];
 #undef VLCStringToMeta
     }
     NSNumber * number = stringToMetaDictionary[string];
@@ -814,26 +809,26 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
     if (!p_url)
         return;
 
-    url = [[NSURL URLWithString:@(p_url)] retain];
+    url = [NSURL URLWithString:@(p_url)];
     if (!url) /* Attempt to interpret as a file path then */
-        url = [[NSURL fileURLWithPath:@(p_url)] retain];
+        url = [NSURL fileURLWithPath:@(p_url)];
     free(p_url);
 
-    libvlc_media_set_user_data(p_md, (void*)self);
+    libvlc_media_set_user_data(p_md, (__bridge void*)self);
 
     libvlc_event_manager_t * p_em = libvlc_media_event_manager( p_md );
-    libvlc_event_attach(p_em, libvlc_MediaMetaChanged,     HandleMediaMetaChanged,     self);
-    libvlc_event_attach(p_em, libvlc_MediaDurationChanged, HandleMediaDurationChanged, self);
-    libvlc_event_attach(p_em, libvlc_MediaStateChanged,    HandleMediaStateChanged,    self);
-    libvlc_event_attach(p_em, libvlc_MediaSubItemAdded,    HandleMediaSubItemAdded,    self);
-    libvlc_event_attach(p_em, libvlc_MediaParsedChanged,   HandleMediaParsedChanged,   self);
+    libvlc_event_attach(p_em, libvlc_MediaMetaChanged,     HandleMediaMetaChanged,     (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaDurationChanged, HandleMediaDurationChanged, (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaStateChanged,    HandleMediaStateChanged,    (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaSubItemAdded,    HandleMediaSubItemAdded,    (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaParsedChanged,   HandleMediaParsedChanged,   (__bridge void *)(self));
 
     libvlc_media_list_t * p_mlist = libvlc_media_subitems( p_md );
 
     if (!p_mlist)
         subitems = nil;
     else {
-        subitems = [[VLCMediaList mediaListWithLibVLCMediaList:p_mlist] retain];
+        subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
         libvlc_media_list_release( p_mlist );
     }
 
@@ -915,7 +910,7 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
     NSAssert( p_mlist, @"The mlist shouldn't be nil, we are receiving a subItemAdded");
 
     [self willChangeValueForKey:@"subitems"];
-    subitems = [[VLCMediaList mediaListWithLibVLCMediaList:p_mlist] retain];
+    subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
     [self didChangeValueForKey:@"subitems"];
     libvlc_media_list_release( p_mlist );
 }
@@ -997,8 +992,7 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
     if (length && value && [length compare:value] == NSOrderedSame)
         return;
 
-    [length release];
-    length = value ? [value retain] : nil;
+    length = value ? value : nil;
 }
 
 @end

+ 25 - 29
Sources/VLCMediaDiscoverer.m

@@ -52,24 +52,24 @@ static NSArray * availableMediaDiscoverer = nil;     // Global list of media dis
 /* libvlc event callback */
 static void HandleMediaDiscovererStarted(const libvlc_event_t * event, void * user_data)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    NSLog(@"HandleMediaDiscovererStarted");
-    id self = user_data;
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(_mediaDiscovererStarted)
-                                       withArgumentAsObject:nil];
-    [pool release];
+    @autoreleasepool {
+        NSLog(@"HandleMediaDiscovererStarted");
+        id self = (__bridge id)(user_data);
+        [[VLCEventManager sharedManager] callOnMainThreadObject:self
+                                                     withMethod:@selector(_mediaDiscovererStarted)
+                                           withArgumentAsObject:nil];
+    }
 }
 
 static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * user_data)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    NSLog(@"HandleMediaDiscovererEnded");
-    id self = user_data;
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(_mediaDiscovererEnded)
-                                       withArgumentAsObject:nil];
-    [pool release];
+    @autoreleasepool {
+        NSLog(@"HandleMediaDiscovererEnded");
+        id self = (__bridge id)(user_data);
+        [[VLCEventManager sharedManager] callOnMainThreadObject:self
+                                                     withMethod:@selector(_mediaDiscovererEnded)
+                                           withArgumentAsObject:nil];
+    }
 }
 
 
@@ -77,10 +77,10 @@ static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * use
 + (NSArray *)availableMediaDiscoverer
 {
     if (!availableMediaDiscoverer) {
-        availableMediaDiscoverer = [@[[[[VLCMediaDiscoverer alloc] initWithName:@"sap"] autorelease],
-                                [[[VLCMediaDiscoverer alloc] initWithName:@"upnp"] autorelease],
-                                [[[VLCMediaDiscoverer alloc] initWithName:@"freebox"] autorelease],
-                                [[[VLCMediaDiscoverer alloc] initWithName:@"video_dir"] autorelease]] retain];
+        availableMediaDiscoverer = @[[[VLCMediaDiscoverer alloc] initWithName:@"sap"],
+                                [[VLCMediaDiscoverer alloc] initWithName:@"upnp"],
+                                [[VLCMediaDiscoverer alloc] initWithName:@"freebox"],
+                                [[VLCMediaDiscoverer alloc] initWithName:@"video_dir"]];
     }
     return availableMediaDiscoverer;
 }
@@ -91,15 +91,15 @@ static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * use
         localizedName = nil;
         discoveredMedia = nil;
 
-        _privateLibrary = [[VLCLibrary sharedLibrary] retain];
+        _privateLibrary = [VLCLibrary sharedLibrary];
         libvlc_retain([_privateLibrary instance]);
 
         mdis = libvlc_media_discoverer_new_from_name([_privateLibrary instance],
                                                      [aServiceName UTF8String]);
         NSAssert(mdis, @"No such media discoverer");
         libvlc_event_manager_t * p_em = libvlc_media_discoverer_event_manager(mdis);
-        libvlc_event_attach(p_em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, self);
-        libvlc_event_attach(p_em, libvlc_MediaDiscovererEnded,   HandleMediaDiscovererEnded,   self);
+        libvlc_event_attach(p_em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, (__bridge void *)(self));
+        libvlc_event_attach(p_em, libvlc_MediaDiscovererEnded,   HandleMediaDiscovererEnded,   (__bridge void *)(self));
 
         running = libvlc_media_discoverer_is_running(mdis);
     }
@@ -109,18 +109,14 @@ static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * use
 - (void)dealloc
 {
     libvlc_event_manager_t *em = libvlc_media_list_event_manager(mdis);
-    libvlc_event_detach(em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, self);
-    libvlc_event_detach(em, libvlc_MediaDiscovererEnded,   HandleMediaDiscovererEnded,   self);
+    libvlc_event_detach(em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, (__bridge void *)(self));
+    libvlc_event_detach(em, libvlc_MediaDiscovererEnded,   HandleMediaDiscovererEnded,   (__bridge void *)(self));
     [[VLCEventManager sharedManager] cancelCallToObject:self];
 
-    [localizedName release];
-    [discoveredMedia release];
     libvlc_media_discoverer_release( mdis );
 
     libvlc_release(_privateLibrary.instance);
-    [_privateLibrary release];
 
-    [super dealloc];
 }
 
 - (VLCMediaList *) discoveredMedia
@@ -132,7 +128,7 @@ static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * use
     VLCMediaList * ret = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
     libvlc_media_list_release( p_mlist );
 
-    discoveredMedia = [ret retain];
+    discoveredMedia = ret;
     return discoveredMedia;
 }
 
@@ -143,7 +139,7 @@ static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * use
 
     char * name = libvlc_media_discoverer_localized_name( mdis );
     if (name) {
-        localizedName = [@(name) retain];
+        localizedName = @(name);
         free( name );
     }
     return localizedName;

+ 18 - 22
Sources/VLCMediaList.m

@@ -52,23 +52,23 @@ NSString *const VLCMediaListItemDeleted      = @"VLCMediaListItemDeleted";
 /* libvlc event callback */
 static void HandleMediaListItemAdded(const libvlc_event_t * event, void * user_data)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    id self = user_data;
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(mediaListItemAdded:)
-                                       withArgumentAsObject:@[@{@"media": [VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_list_item_added.item],
-                                                          @"index": @(event->u.media_list_item_added.index)}]];
-    [pool release];
+    @autoreleasepool {
+        id self = (__bridge id)(user_data);
+        [[VLCEventManager sharedManager] callOnMainThreadObject:self
+                                                     withMethod:@selector(mediaListItemAdded:)
+                                           withArgumentAsObject:@[@{@"media": [VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_list_item_added.item],
+                                                              @"index": @(event->u.media_list_item_added.index)}]];
+    }
 }
 
 static void HandleMediaListItemDeleted( const libvlc_event_t * event, void * user_data)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    id self = user_data;
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(mediaListItemRemoved:)
-                                       withArgumentAsObject:@(event->u.media_list_item_deleted.index)];
-    [pool release];
+    @autoreleasepool {
+        id self = (__bridge id)(user_data);
+        [[VLCEventManager sharedManager] callOnMainThreadObject:self
+                                                     withMethod:@selector(mediaListItemRemoved:)
+                                           withArgumentAsObject:@(event->u.media_list_item_deleted.index)];
+    }
 }
 
 @implementation VLCMediaList
@@ -101,16 +101,14 @@ static void HandleMediaListItemDeleted( const libvlc_event_t * event, void * use
 - (void)dealloc
 {
     libvlc_event_manager_t *em = libvlc_media_list_event_manager(p_mlist);
-    libvlc_event_detach(em, libvlc_MediaListItemDeleted, HandleMediaListItemDeleted, self);
-    libvlc_event_detach(em, libvlc_MediaListItemAdded,   HandleMediaListItemAdded,   self);
+    libvlc_event_detach(em, libvlc_MediaListItemDeleted, HandleMediaListItemDeleted, (__bridge void *)(self));
+    libvlc_event_detach(em, libvlc_MediaListItemAdded,   HandleMediaListItemAdded,   (__bridge void *)(self));
     [[VLCEventManager sharedManager] cancelCallToObject:self];
 
     // Release allocated memory
     delegate = nil;
 
     libvlc_media_list_release( p_mlist );
-    [cachedMedia release];
-    [super dealloc];
 }
 
 - (NSString *)description
@@ -141,8 +139,6 @@ static void HandleMediaListItemDeleted( const libvlc_event_t * event, void * use
 
 - (void)insertMedia:(VLCMedia *)media atIndex: (NSInteger)index
 {
-    [media retain];
-
     // Add it to the libvlc's medialist
     libvlc_media_list_insert_media(p_mlist, [media libVLCMediaDescriptor], (int)index);
 }
@@ -208,7 +204,7 @@ static void HandleMediaListItemDeleted( const libvlc_event_t * event, void * use
 @implementation VLCMediaList (LibVLCBridging)
 + (id)mediaListWithLibVLCMediaList:(void *)p_new_mlist;
 {
-    return [[[VLCMediaList alloc] initWithLibVLCMediaList:p_new_mlist] autorelease];
+    return [[VLCMediaList alloc] initWithLibVLCMediaList:p_new_mlist];
 }
 
 - (id)initWithLibVLCMediaList:(void *)p_new_mlist;
@@ -242,8 +238,8 @@ static void HandleMediaListItemDeleted( const libvlc_event_t * event, void * use
 {
     // Add event callbacks
     libvlc_event_manager_t * p_em = libvlc_media_list_event_manager(p_mlist);
-    libvlc_event_attach( p_em, libvlc_MediaListItemAdded,   HandleMediaListItemAdded,   self);
-    libvlc_event_attach( p_em, libvlc_MediaListItemDeleted, HandleMediaListItemDeleted, self);
+    libvlc_event_attach( p_em, libvlc_MediaListItemAdded,   HandleMediaListItemAdded,   (__bridge void *)(self));
+    libvlc_event_attach( p_em, libvlc_MediaListItemDeleted, HandleMediaListItemDeleted, (__bridge void *)(self));
 }
 
 - (void)mediaListItemAdded:(NSArray *)arrayOfArgs

+ 2 - 10
Sources/VLCMediaListPlayer.m

@@ -53,10 +53,6 @@
 {
     [_mediaPlayer stop];
     libvlc_media_list_player_release(instance);
-    [_mediaPlayer release];
-    [_rootMedia release];
-    [_mediaList release];
-    [super dealloc];
 }
 
 - (VLCMediaPlayer *)mediaPlayer
@@ -68,12 +64,10 @@
 {
     if (_mediaList == mediaList)
         return;
-    [_mediaList release];
-    _mediaList = [mediaList retain];
+    _mediaList = mediaList;
 
     libvlc_media_list_player_set_media_list(instance, [mediaList libVLCMediaList]);
     [self willChangeValueForKey:@"rootMedia"];
-    [_rootMedia release];
     _rootMedia = nil;
     [self didChangeValueForKey:@"rootMedia"];
 }
@@ -87,7 +81,6 @@
 {
     if (_rootMedia == media)
         return;
-    [_rootMedia release];
     _rootMedia = nil;
 
     VLCMediaList *mediaList = [[VLCMediaList alloc] init];
@@ -98,9 +91,8 @@
     [self setMediaList:mediaList];
 
     // Thus set rootMedia here.
-    _rootMedia = [media retain];
+    _rootMedia = media;
 
-    [mediaList release];
 }
 
 - (VLCMedia *)rootMedia

+ 60 - 87
Sources/VLCMediaPlayer.m

@@ -67,25 +67,25 @@ NSString * VLCMediaPlayerStateToString(VLCMediaPlayerState state)
 
 static void HandleMediaTimeChanged(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(mediaPlayerTimeChanged:)
-                                       withArgumentAsObject:@(event->u.media_player_time_changed.new_time)];
-
-    [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:self
-                                                   withDelegateMethod:@selector(mediaPlayerTimeChanged:)
-                                                 withNotificationName:VLCMediaPlayerTimeChanged];
-    [pool release];
+    @autoreleasepool {
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(mediaPlayerTimeChanged:)
+                                           withArgumentAsObject:@(event->u.media_player_time_changed.new_time)];
+
+        [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:(__bridge id)(self)
+                                                       withDelegateMethod:@selector(mediaPlayerTimeChanged:)
+                                                     withNotificationName:VLCMediaPlayerTimeChanged];
+    }
 }
 
 static void HandleMediaPositionChanged(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+    @autoreleasepool {
 
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(mediaPlayerPositionChanged:)
-                                       withArgumentAsObject:@(event->u.media_player_position_changed.new_position)];
-    [pool release];
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(mediaPlayerPositionChanged:)
+                                           withArgumentAsObject:@(event->u.media_player_position_changed.new_position)];
+    }
 }
 
 static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * self)
@@ -109,28 +109,28 @@ static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void *
         return;
     }
 
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+    @autoreleasepool {
 
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(mediaPlayerStateChanged:)
-                                       withArgumentAsObject:@(newState)];
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(mediaPlayerStateChanged:)
+                                           withArgumentAsObject:@(newState)];
 
-    [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:self
-                                                   withDelegateMethod:@selector(mediaPlayerStateChanged:)
-                                                 withNotificationName:VLCMediaPlayerStateChanged];
+        [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:(__bridge id)(self)
+                                                       withDelegateMethod:@selector(mediaPlayerStateChanged:)
+                                                     withNotificationName:VLCMediaPlayerStateChanged];
 
-    [pool release];
+    }
 }
 
 static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * self)
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+    @autoreleasepool {
 
-    [[VLCEventManager sharedManager] callOnMainThreadObject:self
-                                                 withMethod:@selector(mediaPlayerMediaChanged:)
-                                       withArgumentAsObject:[VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_player_media_changed.new_media]];
+        [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
+                                                     withMethod:@selector(mediaPlayerMediaChanged:)
+                                           withArgumentAsObject:[VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_player_media_changed.new_media]];
 
-    [pool release];
+    }
 }
 
 
@@ -173,10 +173,10 @@ static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * s
     static NSDictionary * dict = nil;
     NSSet * superKeyPaths;
     if (!dict) {
-        dict = [@{@"playing": [NSSet setWithObject:@"state"],
+        dict = @{@"playing": [NSSet setWithObject:@"state"],
                 @"seekable": [NSSet setWithObjects:@"state", @"media", nil],
                 @"canPause": [NSSet setWithObjects:@"state", @"media", nil],
-                @"description": [NSSet setWithObjects:@"state", @"media", nil]} retain];
+                @"description": [NSSet setWithObjects:@"state", @"media", nil]};
     }
     if ((superKeyPaths = [super keyPathsForValuesAffectingValueForKey: key])) {
         NSMutableSet * ret = [NSMutableSet setWithSet:dict[key]];
@@ -243,17 +243,6 @@ static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * s
     libvlc_media_player_release(_playerInstance);
     if (_privateLibrary != [VLCLibrary sharedLibrary])
         libvlc_release(_privateLibrary.instance);
-
-    // Get rid of everything else
-    [_media release];
-    [_cachedTime release];
-    [_cachedRemainingTime release];
-    [_drawable release];
-    [_audio release];
-    if (_privateLibrary != [VLCLibrary sharedLibrary])
-        [_privateLibrary release];
-
-    [super dealloc];
 }
 
 - (void)setDelegate:(id)value
@@ -281,12 +270,12 @@ static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * s
 - (void)setDrawable:(id)aDrawable
 {
     // Make sure that this instance has been associated with the drawing canvas.
-    libvlc_media_player_set_nsobject(_playerInstance, aDrawable);
+    libvlc_media_player_set_nsobject(_playerInstance, (__bridge void *)(aDrawable));
 }
 
 - (id)drawable
 {
-    return libvlc_media_player_get_nsobject(_playerInstance);
+    return (__bridge id)(libvlc_media_player_get_nsobject(_playerInstance));
 }
 
 - (VLCAudio *)audio
@@ -900,8 +889,7 @@ static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * s
         if (_media && [_media compare:value] == NSOrderedSame)
             return;
 
-        [_media release];
-        _media = [value retain];
+        _media = value;
 
         libvlc_media_player_set_media(_playerInstance, [_media libVLCMediaDescriptor]);
     }
@@ -1047,17 +1035,6 @@ static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * s
     return libvlc_media_player_will_play(_playerInstance);
 }
 
-static const VLCMediaPlayerState libvlc_to_local_state[] =
-{
-    [libvlc_Stopped]    = VLCMediaPlayerStateStopped,
-    [libvlc_Opening]    = VLCMediaPlayerStateOpening,
-    [libvlc_Buffering]  = VLCMediaPlayerStateBuffering,
-    [libvlc_Playing]    = VLCMediaPlayerStatePlaying,
-    [libvlc_Paused]     = VLCMediaPlayerStatePaused,
-    [libvlc_Ended]      = VLCMediaPlayerStateEnded,
-    [libvlc_Error]      = VLCMediaPlayerStateError
-};
-
 - (VLCMediaPlayerState)state
 {
     return _cachedState;
@@ -1095,8 +1072,8 @@ static const VLCMediaPlayerState libvlc_to_local_state[] =
     if (self = [super init]) {
         _delegate = nil;
         _media = nil;
-        _cachedTime = [[VLCTime nullTime] retain];
-        _cachedRemainingTime = [[VLCTime nullTime] retain];
+        _cachedTime = [VLCTime nullTime];
+        _cachedRemainingTime = [VLCTime nullTime];
         _position = 0.0f;
         _cachedState = VLCMediaPlayerStateStopped;
 
@@ -1108,7 +1085,7 @@ static const VLCMediaPlayerState libvlc_to_local_state[] =
             _privateLibrary = [[VLCLibrary alloc] initWithOptions:options];
         } else {
             VKLog(@"creating player instance using shared library");
-            _privateLibrary = [[VLCLibrary sharedLibrary] retain];
+            _privateLibrary = [VLCLibrary sharedLibrary];
         }
         libvlc_retain([_privateLibrary instance]);
         _playerInstance = libvlc_media_player_new([_privateLibrary instance]);
@@ -1125,48 +1102,46 @@ static const VLCMediaPlayerState libvlc_to_local_state[] =
 {
     // Attach event observers into the media instance
     libvlc_event_manager_t * p_em = libvlc_media_player_event_manager(_playerInstance);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerPlaying,          HandleMediaInstanceStateChanged, self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerPaused,           HandleMediaInstanceStateChanged, self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerEndReached,       HandleMediaInstanceStateChanged, self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerStopped,          HandleMediaInstanceStateChanged, self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerOpening,          HandleMediaInstanceStateChanged, self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerBuffering,        HandleMediaInstanceStateChanged, self);
+    libvlc_event_attach(p_em, libvlc_MediaPlayerPlaying,          HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerPaused,           HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerEndReached,       HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerStopped,          HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerOpening,          HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerBuffering,        HandleMediaInstanceStateChanged, (__bridge void *)(self));
 
-    libvlc_event_attach(p_em, libvlc_MediaPlayerPositionChanged,  HandleMediaPositionChanged,      self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerTimeChanged,      HandleMediaTimeChanged,          self);
-    libvlc_event_attach(p_em, libvlc_MediaPlayerMediaChanged,     HandleMediaPlayerMediaChanged,   self);
+    libvlc_event_attach(p_em, libvlc_MediaPlayerPositionChanged,  HandleMediaPositionChanged,      (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerTimeChanged,      HandleMediaTimeChanged,          (__bridge void *)(self));
+    libvlc_event_attach(p_em, libvlc_MediaPlayerMediaChanged,     HandleMediaPlayerMediaChanged,   (__bridge void *)(self));
 }
 
 - (void)unregisterObservers
 {
     libvlc_event_manager_t * p_em = libvlc_media_player_event_manager(_playerInstance);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerPlaying,          HandleMediaInstanceStateChanged, self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerPaused,           HandleMediaInstanceStateChanged, self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerEndReached,       HandleMediaInstanceStateChanged, self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerStopped,          HandleMediaInstanceStateChanged, self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerOpening,          HandleMediaInstanceStateChanged, self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerBuffering,        HandleMediaInstanceStateChanged, self);
+    libvlc_event_detach(p_em, libvlc_MediaPlayerPlaying,          HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerPaused,           HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerEndReached,       HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerStopped,          HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerOpening,          HandleMediaInstanceStateChanged, (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerBuffering,        HandleMediaInstanceStateChanged, (__bridge void *)(self));
 
-    libvlc_event_detach(p_em, libvlc_MediaPlayerPositionChanged,  HandleMediaPositionChanged,      self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerTimeChanged,      HandleMediaTimeChanged,          self);
-    libvlc_event_detach(p_em, libvlc_MediaPlayerMediaChanged,     HandleMediaPlayerMediaChanged,   self);
+    libvlc_event_detach(p_em, libvlc_MediaPlayerPositionChanged,  HandleMediaPositionChanged,      (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerTimeChanged,      HandleMediaTimeChanged,          (__bridge void *)(self));
+    libvlc_event_detach(p_em, libvlc_MediaPlayerMediaChanged,     HandleMediaPlayerMediaChanged,   (__bridge void *)(self));
 }
 
 - (void)mediaPlayerTimeChanged:(NSNumber *)newTime
 {
     [self willChangeValueForKey:@"time"];
     [self willChangeValueForKey:@"remainingTime"];
-    [_cachedTime release];
-    _cachedTime = [[VLCTime timeWithNumber:newTime] retain];
-    [_cachedRemainingTime release];
+    _cachedTime = [VLCTime timeWithNumber:newTime];
     double currentTime = [[_cachedTime numberValue] doubleValue];
     if (currentTime > 0) {
         double remaining = currentTime / _position * (1 - _position);
-        _cachedRemainingTime = [[VLCTime timeWithNumber:@(-remaining)] retain];
+        _cachedRemainingTime = [VLCTime timeWithNumber:@(-remaining)];
     } else
-        _cachedRemainingTime = [[VLCTime nullTime] retain];
+        _cachedRemainingTime = [VLCTime nullTime];
     [self didChangeValueForKey:@"remainingTime"];
     [self didChangeValueForKey:@"time"];
 }
@@ -1207,10 +1182,8 @@ static const VLCMediaPlayerState libvlc_to_local_state[] =
 {
     [self willChangeValueForKey:@"media"];
     if (_media != newMedia)
-    {
-        [_media release];
-        _media = [newMedia retain];
-    }
+        _media = newMedia;
+
     [self didChangeValueForKey:@"media"];
 }
 

+ 7 - 16
Sources/VLCMediaThumbnailer.m

@@ -40,7 +40,7 @@
 
 static void *lock(void *opaque, void **pixels)
 {
-    VLCMediaThumbnailer *thumbnailer = opaque;
+    VLCMediaThumbnailer *thumbnailer = (__bridge VLCMediaThumbnailer *)(opaque);
 
     *pixels = [thumbnailer dataPointer];
     assert(*pixels);
@@ -54,7 +54,7 @@ static const long long kStandardStartTime = 150000;
 
 void unlock(void *opaque, void *picture, void *const *p_pixels)
 {
-    VLCMediaThumbnailer *thumbnailer = opaque;
+    VLCMediaThumbnailer *thumbnailer = (__bridge VLCMediaThumbnailer *)(opaque);
     assert(!picture);
 
     assert([thumbnailer dataPointer] == *p_pixels);
@@ -83,7 +83,7 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
     [obj setMedia:media];
     [obj setDelegate:delegate];
     [obj setLibVLCinstance:[VLCLibrary sharedInstance]];
-    return [obj autorelease];
+    return obj;
 }
 
 + (VLCMediaThumbnailer *)thumbnailerWithMedia:(VLCMedia *)media delegate:(id<VLCMediaThumbnailerDelegate>)delegate andVLCLibrary:(VLCLibrary *)library
@@ -95,7 +95,7 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
         [obj setLibVLCinstance:library.instance];
     else
         [obj setLibVLCinstance:[VLCLibrary sharedInstance]];
-    return [obj autorelease];
+    return obj;
 }
 
 - (void)dealloc
@@ -106,10 +106,8 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
     NSAssert(!_mp, @"Not properly retained");
     if (_thumbnail)
         CGImageRelease(_thumbnail);
-    [_media release];
     if (_internalLibVLCInstance)
         libvlc_release(_internalLibVLCInstance);
-    [super dealloc];
 }
 
 - (void)setLibVLCinstance:(void *)libVLCinstance
@@ -127,13 +125,11 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
 {
     NSAssert(!_data, @"We are already fetching a thumbnail");
 
-    [self retain]; // Balanced in -notifyDelegate
-
     if (![_media isParsed]) {
         [_media addObserver:self forKeyPath:@"parsed" options:0 context:NULL];
         [_media synchronousParse];
         NSAssert(!_parsingTimeoutTimer, @"We already have a timer around");
-        _parsingTimeoutTimer = [[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(mediaParsingTimedOut) userInfo:nil repeats:NO] retain];
+        _parsingTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(mediaParsingTimedOut) userInfo:nil repeats:NO];
         return;
     }
 
@@ -161,7 +157,6 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
     if (!videoTrack) {
         VKLog(@"WARNING: Can't find video track info, skipping file");
         [_parsingTimeoutTimer invalidate];
-        [_parsingTimeoutTimer release];
         _parsingTimeoutTimer = nil;
         [self mediaThumbnailingTimedOut];
         return;
@@ -199,7 +194,7 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
 
     libvlc_media_player_set_media(_mp, [_media libVLCMediaDescriptor]);
     libvlc_video_set_format(_mp, "RGBA", imageWidth, imageHeight, 4 * imageWidth);
-    libvlc_video_set_callbacks(_mp, lock, unlock, NULL, self);
+    libvlc_video_set_callbacks(_mp, lock, unlock, NULL, (__bridge void *)(self));
     if (snapshotPosition == kSnapshotPosition) {
         int length = _media.length.intValue;
         if (length < kStandardStartTime) {
@@ -214,7 +209,7 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
     libvlc_media_player_play(_mp);
 
     NSAssert(!_thumbnailingTimeoutTimer, @"We already have a timer around");
-    _thumbnailingTimeoutTimer = [[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(mediaThumbnailingTimedOut) userInfo:nil repeats:NO] retain];
+    _thumbnailingTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(mediaThumbnailingTimedOut) userInfo:nil repeats:NO];
 }
 
 - (void)mediaParsingTimedOut
@@ -230,7 +225,6 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
     if (object == _media && [keyPath isEqualToString:@"parsed"]) {
         if ([_media isParsed]) {
             [_parsingTimeoutTimer invalidate];
-            [_parsingTimeoutTimer release];
             _parsingTimeoutTimer = nil;
             [_media removeObserver:self forKeyPath:@"parsed"];
             [self startFetchingThumbnail];
@@ -319,12 +313,9 @@ void unlock(void *opaque, void *picture, void *const *p_pixels)
     _shouldRejectFrames = YES;
 
     [_thumbnailingTimeoutTimer invalidate];
-    [_thumbnailingTimeoutTimer release];
     _thumbnailingTimeoutTimer = nil;
 
     [self performSelectorInBackground:@selector(stopAsync) withObject:nil];
-
-    [self autorelease]; // Balancing -fetchThumbnail
 }
 
 - (void)notifyDelegate

+ 5 - 11
Sources/VLCTime.m

@@ -30,18 +30,18 @@
 {
     static VLCTime * nullTime = nil;
     if (!nullTime)
-        nullTime = [[VLCTime timeWithNumber:nil] retain];
+        nullTime = [VLCTime timeWithNumber:nil];
     return nullTime;
 }
 
 + (VLCTime *)timeWithNumber:(NSNumber *)aNumber
 {
-    return [[[VLCTime alloc] initWithNumber:aNumber] autorelease];
+    return [[VLCTime alloc] initWithNumber:aNumber];
 }
 
 + (VLCTime *)timeWithInt:(int)aInt
 {
-    return [[[VLCTime alloc] initWithInt:aInt] autorelease];
+    return [[VLCTime alloc] initWithInt:aInt];
 }
 
 /* Initializers */
@@ -60,19 +60,13 @@
 {
     if (self = [super init]) {
         if (aInt)
-            value = [@(aInt) retain];
+            value = @(aInt);
         else
             value = nil;
     }
     return self;
 }
 
-- (void)dealloc
-{
-    [value release];
-    [super dealloc];
-}
-
 - (id)copyWithZone:(NSZone *)zone
 {
     return [[VLCTime alloc] initWithNumber:value];
@@ -87,7 +81,7 @@
 /* Operations */
 - (NSNumber *)numberValue
 {
-    return value ? [[value copy] autorelease] : nil;
+    return value ? [value copy] : nil;
 }
 
 - (NSString *)stringValue