From cdbea788bef6d202c7721161b295cc312d06fabc Mon Sep 17 00:00:00 2001 From: Dafydd Williams Date: Thu, 8 Sep 2011 16:10:21 +1000 Subject: [PATCH 1/4] Converted project to ARC (safe for iOS4 -- no "weak" keyword). --- Classes/DetailViewController.h | 6 +++--- Classes/DetailViewController.m | 16 ++-------------- Classes/MGSplitCornersView.h | 6 +++--- Classes/MGSplitCornersView.m | 4 +--- Classes/MGSplitDividerView.m | 1 - Classes/MGSplitViewAppDelegate.h | 8 ++++---- Classes/MGSplitViewAppDelegate.m | 7 ------- Classes/MGSplitViewController.h | 8 ++++---- Classes/MGSplitViewController.m | 25 ++++++------------------- Classes/RootViewController.h | 2 +- Classes/RootViewController.m | 7 +------ MGSplitView.xcodeproj/project.pbxproj | 3 +++ main.m | 8 ++++---- 13 files changed, 32 insertions(+), 69 deletions(-) diff --git a/Classes/DetailViewController.h b/Classes/DetailViewController.h index e73db05..d80dfde 100644 --- a/Classes/DetailViewController.h +++ b/Classes/DetailViewController.h @@ -22,9 +22,9 @@ UILabel *detailDescriptionLabel; } -@property (nonatomic, retain) IBOutlet UIToolbar *toolbar; -@property (nonatomic, retain) id detailItem; -@property (nonatomic, retain) IBOutlet UILabel *detailDescriptionLabel; +@property (nonatomic, strong) IBOutlet UIToolbar *toolbar; +@property (nonatomic, strong) id detailItem; +@property (nonatomic, strong) IBOutlet UILabel *detailDescriptionLabel; - (IBAction)toggleMasterView:(id)sender; - (IBAction)toggleVertical:(id)sender; diff --git a/Classes/DetailViewController.m b/Classes/DetailViewController.m index 610e9e2..160e925 100644 --- a/Classes/DetailViewController.m +++ b/Classes/DetailViewController.m @@ -12,7 +12,7 @@ @interface DetailViewController () -@property (nonatomic, retain) UIPopoverController *popoverController; +@property (nonatomic, strong) UIPopoverController *popoverController; - (void)configureView; @end @@ -32,8 +32,7 @@ @implementation DetailViewController - (void)setDetailItem:(id)newDetailItem { if (detailItem != newDetailItem) { - [detailItem release]; - detailItem = [newDetailItem retain]; + detailItem = newDetailItem; // Update the view. [self configureView]; @@ -72,7 +71,6 @@ - (void)splitViewController:(MGSplitViewController*)svc NSMutableArray *items = [[toolbar items] mutableCopy]; [items insertObject:barButtonItem atIndex:0]; [toolbar setItems:items animated:YES]; - [items release]; } self.popoverController = pc; } @@ -89,7 +87,6 @@ - (void)splitViewController:(MGSplitViewController*)svc NSMutableArray *items = [[toolbar items] mutableCopy]; [items removeObject:barButtonItem]; [toolbar setItems:items animated:YES]; - [items release]; } self.popoverController = nil; } @@ -172,15 +169,6 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceO } -- (void)dealloc -{ - [popoverController release]; - [toolbar release]; - - [detailItem release]; - [detailDescriptionLabel release]; - [super dealloc]; -} @end diff --git a/Classes/MGSplitCornersView.h b/Classes/MGSplitCornersView.h index 0f83c34..e8c060f 100644 --- a/Classes/MGSplitCornersView.h +++ b/Classes/MGSplitCornersView.h @@ -18,14 +18,14 @@ typedef enum _MGCornersPosition { @class MGSplitViewController; @interface MGSplitCornersView : UIView { float cornerRadius; - MGSplitViewController *splitViewController; + MGSplitViewController *__unsafe_unretained splitViewController; MGCornersPosition cornersPosition; UIColor *cornerBackgroundColor; } @property (nonatomic, assign) float cornerRadius; -@property (nonatomic, assign) MGSplitViewController *splitViewController; // weak ref. +@property (nonatomic, unsafe_unretained) MGSplitViewController *splitViewController; // weak ref. @property (nonatomic, assign) MGCornersPosition cornersPosition; // don't change this manually; let the splitViewController manage it. -@property (nonatomic, retain) UIColor *cornerBackgroundColor; +@property (nonatomic, strong) UIColor *cornerBackgroundColor; @end diff --git a/Classes/MGSplitCornersView.m b/Classes/MGSplitCornersView.m index 7bb2913..718e41a 100644 --- a/Classes/MGSplitCornersView.m +++ b/Classes/MGSplitCornersView.m @@ -35,7 +35,6 @@ - (void)dealloc { self.cornerBackgroundColor = nil; - [super dealloc]; } @@ -225,8 +224,7 @@ - (void)setCornersPosition:(MGCornersPosition)posn - (void)setCornerBackgroundColor:(UIColor *)color { if (color != cornerBackgroundColor) { - [cornerBackgroundColor release]; - cornerBackgroundColor = [color retain]; + cornerBackgroundColor = color; [self setNeedsDisplay]; } } diff --git a/Classes/MGSplitDividerView.m b/Classes/MGSplitDividerView.m index b110ba7..02b675d 100644 --- a/Classes/MGSplitDividerView.m +++ b/Classes/MGSplitDividerView.m @@ -31,7 +31,6 @@ - (id)initWithFrame:(CGRect)frame - (void)dealloc { self.splitViewController = nil; - [super dealloc]; } diff --git a/Classes/MGSplitViewAppDelegate.h b/Classes/MGSplitViewAppDelegate.h index c2fac53..1d2df6c 100644 --- a/Classes/MGSplitViewAppDelegate.h +++ b/Classes/MGSplitViewAppDelegate.h @@ -19,10 +19,10 @@ DetailViewController *detailViewController; } -@property (nonatomic, retain) IBOutlet UIWindow *window; +@property (nonatomic, strong) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet MGSplitViewController *splitViewController; -@property (nonatomic, retain) IBOutlet RootViewController *rootViewController; -@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController; +@property (nonatomic, strong) IBOutlet MGSplitViewController *splitViewController; +@property (nonatomic, strong) IBOutlet RootViewController *rootViewController; +@property (nonatomic, strong) IBOutlet DetailViewController *detailViewController; @end diff --git a/Classes/MGSplitViewAppDelegate.m b/Classes/MGSplitViewAppDelegate.m index 8a70601..dfbcf98 100644 --- a/Classes/MGSplitViewAppDelegate.m +++ b/Classes/MGSplitViewAppDelegate.m @@ -35,13 +35,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( } -- (void)dealloc -{ - [splitViewController release]; - [window release]; - - [super dealloc]; -} @end diff --git a/Classes/MGSplitViewController.h b/Classes/MGSplitViewController.h index d902dc3..fd20784 100644 --- a/Classes/MGSplitViewController.h +++ b/Classes/MGSplitViewController.h @@ -33,7 +33,7 @@ typedef enum _MGSplitViewDividerStyle { MGSplitViewDividerStyle _dividerStyle; // Meta-setting which configures several aspects of appearance and behaviour. } -@property (nonatomic, assign) IBOutlet id delegate; +@property (nonatomic, unsafe_unretained) IBOutlet id delegate; @property (nonatomic, assign) BOOL showsMasterInPortrait; // applies to both portrait orientations (default NO) @property (nonatomic, assign) BOOL showsMasterInLandscape; // applies to both landscape orientations (default YES) @property (nonatomic, assign, getter=isVertical) BOOL vertical; // if NO, split is horizontal, i.e. master above detail (default YES) @@ -43,9 +43,9 @@ typedef enum _MGSplitViewDividerStyle { @property (nonatomic, assign) BOOL allowsDraggingDivider; // whether to let the user drag the divider to alter the split position (default NO). @property (nonatomic, copy) NSArray *viewControllers; // array of UIViewControllers; master is at index 0, detail is at index 1. -@property (nonatomic, retain) IBOutlet UIViewController *masterViewController; // convenience. -@property (nonatomic, retain) IBOutlet UIViewController *detailViewController; // convenience. -@property (nonatomic, retain) MGSplitDividerView *dividerView; // the view which draws the divider/split between master and detail. +@property (nonatomic, strong) IBOutlet UIViewController *masterViewController; // convenience. +@property (nonatomic, strong) IBOutlet UIViewController *detailViewController; // convenience. +@property (nonatomic, strong) MGSplitDividerView *dividerView; // the view which draws the divider/split between master and detail. @property (nonatomic, assign) MGSplitViewDividerStyle dividerStyle; // style (and behaviour) of the divider between master and detail. @property (nonatomic, readonly, getter=isLandscape) BOOL landscape; // returns YES if this view controller is in either of the two Landscape orientations, else NO. diff --git a/Classes/MGSplitViewController.m b/Classes/MGSplitViewController.m index 61b30a6..d3ee227 100644 --- a/Classes/MGSplitViewController.m +++ b/Classes/MGSplitViewController.m @@ -149,13 +149,7 @@ - (void)dealloc { _delegate = nil; [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; - [_viewControllers release]; - [_barButtonItem release]; - [_hiddenPopoverController release]; - [_dividerView release]; - [_cornerViews release]; - [super dealloc]; } @@ -432,8 +426,6 @@ - (void)layoutSubviewsForInterfaceOrientation:(UIInterfaceOrientation)theOrienta trailingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR; trailingCorners.cornerRadius = MG_DEFAULT_CORNER_RADIUS; _cornerViews = [[NSArray alloc] initWithObjects:leadingCorners, trailingCorners, nil]; - [leadingCorners release]; - [trailingCorners release]; } else if ([_cornerViews count] == 2) { leadingCorners = [_cornerViews objectAtIndex:0]; @@ -554,7 +546,6 @@ - (void)reconfigureForMasterInPopover:(BOOL)inPopover if (inPopover && !_hiddenPopoverController && !_barButtonItem) { // Create and configure popover for our masterViewController. - [_hiddenPopoverController release]; _hiddenPopoverController = nil; [self.masterViewController viewWillDisappear:NO]; _hiddenPopoverController = [[UIPopoverController alloc] initWithContentViewController:self.masterViewController]; @@ -580,7 +571,6 @@ - (void)reconfigureForMasterInPopover:(BOOL)inPopover // Remove master from popover and destroy popover, if it exists. [_hiddenPopoverController dismissPopoverAnimated:NO]; - [_hiddenPopoverController release]; _hiddenPopoverController = nil; // Inform delegate that the _barButtonItem will become invalid. @@ -591,7 +581,6 @@ - (void)reconfigureForMasterInPopover:(BOOL)inPopover } // Destroy _barButtonItem. - [_barButtonItem release]; _barButtonItem = nil; // Move master view. @@ -906,7 +895,7 @@ - (void)setSplitWidth:(float)width - (NSArray *)viewControllers { - return [[_viewControllers copy] autorelease]; + return [_viewControllers copy]; } @@ -918,7 +907,6 @@ - (void)setViewControllers:(NSArray *)controllers [controller.view removeFromSuperview]; } } - [_viewControllers release]; _viewControllers = [[NSMutableArray alloc] initWithCapacity:2]; if (controllers && [controllers count] >= 2) { self.masterViewController = [controllers objectAtIndex:0]; @@ -937,7 +925,7 @@ - (UIViewController *)masterViewController if (_viewControllers && [_viewControllers count] > 0) { NSObject *controller = [_viewControllers objectAtIndex:0]; if ([controller isKindOfClass:[UIViewController class]]) { - return [[controller retain] autorelease]; + return controller; } } @@ -979,7 +967,7 @@ - (UIViewController *)detailViewController if (_viewControllers && [_viewControllers count] > 1) { NSObject *controller = [_viewControllers objectAtIndex:1]; if ([controller isKindOfClass:[UIViewController class]]) { - return [[controller retain] autorelease]; + return controller; } } @@ -1014,7 +1002,7 @@ - (void)setDetailViewController:(UIViewController *)detail - (MGSplitDividerView *)dividerView { - return [[_dividerView retain] autorelease]; + return _dividerView; } @@ -1022,8 +1010,7 @@ - (void)setDividerView:(MGSplitDividerView *)divider { if (divider != _dividerView) { [_dividerView removeFromSuperview]; - [_dividerView release]; - _dividerView = [divider retain]; + _dividerView = divider; _dividerView.splitViewController = self; _dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR; if ([self isShowingMaster]) { @@ -1109,7 +1096,7 @@ - (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle animated:(BOOL)animate - (NSArray *)cornerViews { if (_cornerViews) { - return [[_cornerViews retain] autorelease]; + return _cornerViews; } return nil; diff --git a/Classes/RootViewController.h b/Classes/RootViewController.h index 309e0ff..f708059 100644 --- a/Classes/RootViewController.h +++ b/Classes/RootViewController.h @@ -14,7 +14,7 @@ DetailViewController *detailViewController; } -@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController; +@property (nonatomic, strong) IBOutlet DetailViewController *detailViewController; - (void)selectFirstRow; diff --git a/Classes/RootViewController.m b/Classes/RootViewController.m index 38a9ee4..4dda54d 100644 --- a/Classes/RootViewController.m +++ b/Classes/RootViewController.m @@ -70,7 +70,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N // Dequeue or create a cell of the appropriate type. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryNone; } @@ -95,11 +95,6 @@ - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath #pragma mark Memory management -- (void)dealloc -{ - [detailViewController release]; - [super dealloc]; -} @end diff --git a/MGSplitView.xcodeproj/project.pbxproj b/MGSplitView.xcodeproj/project.pbxproj index b0a889d..81d627e 100755 --- a/MGSplitView.xcodeproj/project.pbxproj +++ b/MGSplitView.xcodeproj/project.pbxproj @@ -176,6 +176,7 @@ isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MGSplitView" */; compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, @@ -227,6 +228,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -242,6 +244,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MGSplitView_Prefix.pch; diff --git a/main.m b/main.m index bf7094f..5b057b1 100644 --- a/main.m +++ b/main.m @@ -10,8 +10,8 @@ int main(int argc, char *argv[]) { - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - [pool release]; - return retVal; + @autoreleasepool { + int retVal = UIApplicationMain(argc, argv, nil, nil); + return retVal; + } } From bb36956150ce9933b608205b50b18c8073a02d2f Mon Sep 17 00:00:00 2001 From: Dafydd Williams Date: Thu, 8 Sep 2011 19:06:12 +1000 Subject: [PATCH 2/4] Update iOS deployment target to 4.0 ARC won't work on 3.2. --- MGSplitView.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MGSplitView.xcodeproj/project.pbxproj b/MGSplitView.xcodeproj/project.pbxproj index 81d627e..be27d18 100755 --- a/MGSplitView.xcodeproj/project.pbxproj +++ b/MGSplitView.xcodeproj/project.pbxproj @@ -263,6 +263,7 @@ GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.0; PREBINDING = NO; SDKROOT = iphoneos3.2; TARGETED_DEVICE_FAMILY = 2; @@ -277,6 +278,7 @@ GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PREBINDING = NO; SDKROOT = iphoneos3.2; From 5e42d858fdf3b83cf4b05fd3e750d8d9e804b3d4 Mon Sep 17 00:00:00 2001 From: Dafydd Williams Date: Thu, 8 Sep 2011 19:06:34 +1000 Subject: [PATCH 3/4] Fixed a bug whereby an assign should have been an unsafe_unretained. --- Classes/MGSplitDividerView.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/MGSplitDividerView.h b/Classes/MGSplitDividerView.h index 2d6db15..4df6315 100644 --- a/Classes/MGSplitDividerView.h +++ b/Classes/MGSplitDividerView.h @@ -10,11 +10,11 @@ @class MGSplitViewController; @interface MGSplitDividerView : UIView { - MGSplitViewController *splitViewController; + MGSplitViewController* __unsafe_unretained splitViewController; BOOL allowsDragging; } -@property (nonatomic, assign) MGSplitViewController *splitViewController; // weak ref. +@property (nonatomic, unsafe_unretained) MGSplitViewController *splitViewController; // weak ref. @property (nonatomic, assign) BOOL allowsDragging; - (void)drawGripThumbInRect:(CGRect)rect; From 9215d9f552368da3e2cc8ea15860eca3f2a6b85c Mon Sep 17 00:00:00 2001 From: Dafydd Williams Date: Fri, 9 Sep 2011 10:44:59 +1000 Subject: [PATCH 4/4] Updated README to note the main difference, while maintaining Matt's attribution. --- README.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.markdown b/README.markdown index cf17275..7b026ff 100644 --- a/README.markdown +++ b/README.markdown @@ -3,6 +3,8 @@ MGSplitViewController MGSplitViewController is a replacement for UISplitViewController, with various useful enhancements. +[_This fork replaces manual reference counting with ARC, as implemented by Clang in Xcode4.2 and later_ - Dafydd Williams] + Donations ---------