From 92d58787483c6a0f114871d1cac51b6632b3d6b4 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 14 Oct 2011 20:47:53 -0400 Subject: [PATCH] Fix up some retain/release issues with UIScreenMode objects. Fixes Bugzilla #1191. This patch is based on work done by Vittorio Giovara. --- src/video/uikit/SDL_uikitvideo.m | 14 ++++++++------ src/video/uikit/SDL_uikitwindow.m | 7 ++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/video/uikit/SDL_uikitvideo.m b/src/video/uikit/SDL_uikitvideo.m index 4b9f24071..2678a37aa 100644 --- a/src/video/uikit/SDL_uikitvideo.m +++ b/src/video/uikit/SDL_uikitvideo.m @@ -212,7 +212,8 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) mode.h = h; mode.refresh_rate = 0; - [uimode retain]; + [uimode retain]; // once for the desktop_mode + [uimode retain]; // once for the current_mode mode.driverdata = uimode; SDL_zero(display); @@ -286,13 +287,14 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) UIScreen *uiscreen = (UIScreen *) display->driverdata; [uiscreen release]; display->driverdata = NULL; + [((UIScreenMode *) display->desktop_mode.driverdata) release]; + display->desktop_mode.driverdata = NULL; + [((UIScreenMode *) display->current_mode.driverdata) release]; + display->current_mode.driverdata = NULL; for (j = 0; j < display->num_display_modes; j++) { SDL_DisplayMode *mode = &display->display_modes[j]; - UIScreenMode *uimode = (UIScreenMode *) mode->driverdata; - if (uimode) { - [uimode release]; - mode->driverdata = NULL; - } + [((UIScreenMode *) mode->driverdata) release]; + mode->driverdata = NULL; } } } diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m index 1745f0033..fc35762a4 100644 --- a/src/video/uikit/SDL_uikitwindow.m +++ b/src/video/uikit/SDL_uikitwindow.m @@ -151,8 +151,13 @@ static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bo if (bestmode) { UIScreenMode *uimode = (UIScreenMode *) bestmode->driverdata; [uiscreen setCurrentMode:uimode]; - display->desktop_mode = *bestmode; + + // desktop_mode doesn't change here (the higher level will + // use it to set all the screens back to their defaults + // upon window destruction, SDL_Quit(), etc. + [((UIScreenMode *) display->current_mode.driverdata) release]; display->current_mode = *bestmode; + [((UIScreenMode *) display->current_mode.driverdata) retain]; } } }