Skip to content

Commit

Permalink
Explicitly retain and release NSObjects in C structures
Browse files Browse the repository at this point in the history
Fixes #9021
Fixes #9042

(cherry picked from commit 42cdbf6)
(cherry picked from commit 971c5c2)
  • Loading branch information
slouken committed Feb 12, 2024
1 parent 0f6a682 commit 0fb294a
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions src/joystick/iphoneos/SDL_mfijoystick.m
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ static BOOL IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle
NSDictionary<NSString *, GCControllerElement *> *elements = controller.physicalInputProfile.elements;

/* Provide both axes and analog buttons as SDL axes */
device->axes = [[[elements allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]
NSArray *axes = [[[elements allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]
filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) {
GCControllerElement *element;

Expand All @@ -527,8 +527,7 @@ static BOOL IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle
}
return NO;
}]];
device->naxes = (int)device->axes.count;
device->buttons = [[[elements allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]
NSArray *buttons = [[[elements allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]
filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) {
GCControllerElement *element;

Expand All @@ -542,7 +541,12 @@ static BOOL IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCControlle
}
return NO;
}]];
device->nbuttons = (int)device->buttons.count;
/* Explicitly retain the arrays because SDL_JoystickDeviceItem is a
* struct, and ARC doesn't work with structs. */
device->naxes = (int)axes.count;
device->axes = (__bridge NSArray *)CFBridgingRetain(axes);
device->nbuttons = (int)buttons.count;
device->buttons = (__bridge NSArray *)CFBridgingRetain(buttons);
subtype = 4;

#ifdef DEBUG_CONTROLLER_PROFILE
Expand Down Expand Up @@ -779,13 +783,20 @@ static void IOS_AddJoystickDevice(GCController *controller, SDL_bool acceleromet

#ifdef SDL_JOYSTICK_MFI
@autoreleasepool {
/* These were explicitly retained in the struct, so they should be explicitly released before freeing the struct. */
if (device->controller) {
/* The controller was explicitly retained in the struct, so it
* should be explicitly released before freeing the struct. */
GCController *controller = CFBridgingRelease((__bridge CFTypeRef)(device->controller));
controller.controllerPausedHandler = nil;
device->controller = nil;
}
if (device->axes) {
NSArray *axes = CFBridgingRelease((__bridge CFTypeRef)(device->axes));
device->axes = nil;
}
if (device->buttons) {
NSArray *buttons = CFBridgingRelease((__bridge CFTypeRef)(device->buttons));
device->buttons = nil;
}
}
#endif /* SDL_JOYSTICK_MFI */

Expand Down

0 comments on commit 0fb294a

Please sign in to comment.