| Index: ios/chrome/browser/ui/browser_view_controller.mm
|
| diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
|
| index e4b9c0f71612ce81e846a255da2c38298bebc590..a3df8b63dfca85dd6775a1e046ae03c2a2e8fda1 100644
|
| --- a/ios/chrome/browser/ui/browser_view_controller.mm
|
| +++ b/ios/chrome/browser/ui/browser_view_controller.mm
|
| @@ -26,7 +26,7 @@
|
| #include "base/mac/bind_objc_block.h"
|
| #include "base/mac/bundle_locations.h"
|
| #include "base/mac/foundation_util.h"
|
| -#include "base/mac/objc_property_releaser.h"
|
| +
|
| #import "base/mac/scoped_block.h"
|
| #import "base/mac/scoped_nsobject.h"
|
| #include "base/macros.h"
|
| @@ -200,6 +200,10 @@
|
| #include "ui/base/page_transition_types.h"
|
| #include "url/gurl.h"
|
|
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| using base::UserMetricsAction;
|
| using bookmarks::BookmarkNode;
|
|
|
| @@ -490,17 +494,16 @@ NSString* const kNativeControllerTemporaryKey = @"NativeControllerTemporaryKey";
|
| base::scoped_nsobject<AlertCoordinator> _alertCoordinator;
|
|
|
| // Releaser for properties that aren't backed by scoped_nsobjects.
|
| - base::mac::ObjCPropertyReleaser _propertyReleaser_BrowserViewController;
|
| }
|
|
|
| // The browser's side swipe controller. Lazily instantiated on the first call.
|
| -@property(nonatomic, retain, readonly) SideSwipeController* sideSwipeController;
|
| +@property(nonatomic, strong, readonly) SideSwipeController* sideSwipeController;
|
| // The browser's preload controller.
|
| -@property(nonatomic, retain, readonly) PreloadController* preloadController;
|
| +@property(nonatomic, strong, readonly) PreloadController* preloadController;
|
| // The dialog presenter for this BVC's tab model.
|
| -@property(nonatomic, retain, readonly) DialogPresenter* dialogPresenter;
|
| +@property(nonatomic, strong, readonly) DialogPresenter* dialogPresenter;
|
| // The object that manages keyboard commands on behalf of the BVC.
|
| -@property(nonatomic, retain, readonly) KeyCommandsProvider* keyCommandsProvider;
|
| +@property(nonatomic, strong, readonly) KeyCommandsProvider* keyCommandsProvider;
|
| // Whether the current tab can enable the reader mode menu item.
|
| @property(nonatomic, assign, readonly) BOOL canUseReaderMode;
|
| // Whether the current tab can enable the request desktop menu item.
|
| @@ -530,7 +533,7 @@ NSString* const kNativeControllerTemporaryKey = @"NativeControllerTemporaryKey";
|
| @property(nonatomic, readonly) BOOL shouldShowVoiceSearchBar;
|
| // Coordinator for displaying a modal overlay with activity indicator to prevent
|
| // the user from interacting with the browser view.
|
| -@property(nonatomic, retain)
|
| +@property(nonatomic, strong)
|
| ActivityOverlayCoordinator* activityOverlayCoordinator;
|
|
|
| // The user agent type used to load the currently visible page. User agent type
|
| @@ -825,7 +828,7 @@ class InfoBarContainerDelegateIOS
|
|
|
| bool DrawInfoBarArrows(int* x) const override { return false; }
|
|
|
| - BrowserViewController* controller_; // weak
|
| + __weak BrowserViewController* controller_;
|
| };
|
|
|
| // Called from the BrowserBookmarkModelBridge from C++ -> ObjC.
|
| @@ -884,7 +887,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| }
|
|
|
| private:
|
| - BrowserViewController* owner_; // Weak.
|
| + __weak BrowserViewController* owner_;
|
| };
|
|
|
| @implementation BrowserViewController
|
| @@ -908,11 +911,9 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| self = [super initWithNibName:nil bundle:base::mac::FrameworkBundle()];
|
| if (self) {
|
| DCHECK(factory);
|
| - _propertyReleaser_BrowserViewController.Init(self,
|
| - [BrowserViewController class]);
|
| - _dependencyFactory.reset([factory retain]);
|
| - _nativeControllersForTabIDs.reset(
|
| - [[NSMapTable strongToWeakObjectsMapTable] retain]);
|
| +
|
| + _dependencyFactory.reset(factory);
|
| + _nativeControllersForTabIDs.reset([NSMapTable strongToWeakObjectsMapTable]);
|
| _dialogPresenter.reset([[DialogPresenter alloc] initWithDelegate:self
|
| presentingViewController:self]);
|
| _javaScriptDialogPresenter.reset(
|
| @@ -956,7 +957,6 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| _voiceSearchController->SetDelegate(nil);
|
| [_rateThisAppDialog setDelegate:nil];
|
| [_model closeAllTabs];
|
| - [super dealloc];
|
| }
|
|
|
| #pragma mark - Accessibility
|
| @@ -982,8 +982,8 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| [self.activityOverlayCoordinator stop];
|
| self.activityOverlayCoordinator = nil;
|
| } else if (!self.activityOverlayCoordinator) {
|
| - self.activityOverlayCoordinator = [[[ActivityOverlayCoordinator alloc]
|
| - initWithBaseViewController:self] autorelease];
|
| + self.activityOverlayCoordinator =
|
| + [[ActivityOverlayCoordinator alloc] initWithBaseViewController:self];
|
| [self.activityOverlayCoordinator start];
|
| }
|
|
|
| @@ -1172,11 +1172,10 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| UIViewAutoresizing initialViewAutoresizing =
|
| UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
|
|
| - self.contentArea = [[[BrowserContainerView alloc]
|
| - initWithFrame:initialViewsRect] autorelease];
|
| + self.contentArea =
|
| + [[BrowserContainerView alloc] initWithFrame:initialViewsRect];
|
| self.contentArea.autoresizingMask = initialViewAutoresizing;
|
| - self.typingShield =
|
| - [[[UIButton alloc] initWithFrame:initialViewsRect] autorelease];
|
| + self.typingShield = [[UIButton alloc] initWithFrame:initialViewsRect];
|
| self.typingShield.autoresizingMask = initialViewAutoresizing;
|
| [self.typingShield addTarget:self
|
| action:@selector(shieldWasTapped:)
|
| @@ -1338,7 +1337,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| base::WeakNSObject<BrowserViewController> weakSelf(self);
|
| void (^completion)(id<UIViewControllerTransitionCoordinatorContext>) = ^(
|
| id<UIViewControllerTransitionCoordinatorContext> context) {
|
| - base::scoped_nsobject<BrowserViewController> strongSelf([weakSelf retain]);
|
| + base::scoped_nsobject<BrowserViewController> strongSelf(weakSelf);
|
| if (strongSelf)
|
| [strongSelf showFindBarWithAnimation:NO
|
| selectText:NO
|
| @@ -1359,7 +1358,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| [super dismissViewControllerAnimated:flag
|
| completion:^{
|
| base::scoped_nsobject<BrowserViewController>
|
| - strongSelf([weakSelf retain]);
|
| + strongSelf(weakSelf);
|
| [strongSelf setDismissingModal:NO];
|
| [strongSelf setPresenting:NO];
|
| if (completion)
|
| @@ -1632,7 +1631,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| DCHECK(!_browserState);
|
| _browserState = browserState;
|
| _isOffTheRecord = browserState->IsOffTheRecord() ? YES : NO;
|
| - _model.reset([model retain]);
|
| + _model.reset(model);
|
| [_model addObserver:self];
|
|
|
| if (!_isOffTheRecord) {
|
| @@ -1763,8 +1762,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| // Create contextual search views and controller.
|
| if ([TouchToSearchPermissionsMediator isTouchToSearchAvailableOnDevice] &&
|
| !_browserState->IsOffTheRecord()) {
|
| - _contextualSearchMask =
|
| - [[[ContextualSearchMaskView alloc] init] autorelease];
|
| + _contextualSearchMask = [[ContextualSearchMaskView alloc] init];
|
| [self.view insertSubview:_contextualSearchMask
|
| belowSubview:[_toolbarController view]];
|
| _contextualSearchPanel = [self createPanelView];
|
| @@ -2045,8 +2043,8 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| NSString* contentType = base::SysUTF8ToNSString(postData->first);
|
| NSData* data = [NSData dataWithBytes:(void*)postData->second.data()
|
| length:postData->second.length()];
|
| - params.post_data.reset([data retain]);
|
| - params.extra_headers.reset([@{ @"Content-Type" : contentType } retain]);
|
| + params.post_data.reset(data);
|
| + params.extra_headers.reset(@{ @"Content-Type" : contentType });
|
| }
|
| Tab* tab = [_model insertTabWithLoadParams:params
|
| opener:nil
|
| @@ -2076,7 +2074,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| CGRect viewBounds, remainder;
|
| CGRectDivide(self.view.bounds, &remainder, &viewBounds, StatusBarHeight(),
|
| CGRectMinYEdge);
|
| - return [[[UIImageView alloc] initWithFrame:viewBounds] autorelease];
|
| + return [[UIImageView alloc] initWithFrame:viewBounds];
|
| }
|
|
|
| - (UIImageView*)pageOpenCloseAnimationView {
|
| @@ -2085,8 +2083,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| frame.size.height = frame.size.height - [self headerHeight];
|
| frame.origin.y = [self headerHeight];
|
|
|
| - UIImageView* pageView =
|
| - [[[UIImageView alloc] initWithFrame:frame] autorelease];
|
| + UIImageView* pageView = [[UIImageView alloc] initWithFrame:frame];
|
| CGPoint center = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame));
|
| pageView.center = center;
|
|
|
| @@ -2190,9 +2187,9 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| int delay = immediately ? 0 : kExternalFilesCleanupDelaySeconds;
|
| _externalFileRemover->RemoveAfterDelay(
|
| base::TimeDelta::FromSeconds(delay),
|
| - base::BindBlock(completionHandler ? completionHandler
|
| - : ^{
|
| - }));
|
| + base::BindBlockArc(completionHandler ? completionHandler
|
| + : ^{
|
| + }));
|
| }
|
|
|
| #pragma mark - SnapshotOverlayProvider methods
|
| @@ -2298,9 +2295,9 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| CGFloat width = CGRectGetWidth([[self view] bounds]);
|
| CGFloat y = CGRectGetHeight([[self view] bounds]) - kVoiceSearchBarHeight;
|
| CGRect frame = CGRectMake(0.0, y, width, kVoiceSearchBarHeight);
|
| - _voiceSearchBar.reset([ios::GetChromeBrowserProvider()
|
| - ->GetVoiceSearchProvider()
|
| - ->BuildVoiceSearchBar(frame) retain]);
|
| + _voiceSearchBar.reset(ios::GetChromeBrowserProvider()
|
| + ->GetVoiceSearchProvider()
|
| + ->BuildVoiceSearchBar(frame));
|
| [_voiceSearchBar setVoiceSearchBarDelegate:self];
|
| [_voiceSearchBar setHidden:YES];
|
| [_voiceSearchBar setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin |
|
| @@ -2625,7 +2622,8 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| CGPointMake(CGRectGetMidX(view.frame),
|
| CGRectGetMinY(view.frame) + [self headerHeightForTab:tab]);
|
| auto* helper = RepostFormTabHelper::FromWebState(webState);
|
| - helper->PresentDialog(dialogLocation, base::BindBlock(^(bool shouldContinue) {
|
| + helper->PresentDialog(dialogLocation,
|
| + base::BindBlockArc(^(bool shouldContinue) {
|
| handler(shouldContinue);
|
| }));
|
| }
|
| @@ -2671,30 +2669,30 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| if (!IsIPadIdiom()) {
|
| if ([_toolbarController view]) {
|
| HeaderDefinition header = {
|
| - base::scoped_nsobject<UIView>([[_toolbarController view] retain]),
|
| - Hideable, [ToolbarController toolbarDropShadowHeight], 0.0,
|
| + base::scoped_nsobject<UIView>([_toolbarController view]), Hideable,
|
| + [ToolbarController toolbarDropShadowHeight], 0.0,
|
| };
|
| results.push_back(header);
|
| }
|
| } else {
|
| if ([_tabStripController view]) {
|
| HeaderDefinition header = {
|
| - base::scoped_nsobject<UIView>([[_tabStripController view] retain]),
|
| - Hideable, 0.0, 0.0,
|
| + base::scoped_nsobject<UIView>([_tabStripController view]), Hideable,
|
| + 0.0, 0.0,
|
| };
|
| results.push_back(header);
|
| }
|
| if ([_toolbarController view]) {
|
| HeaderDefinition header = {
|
| - base::scoped_nsobject<UIView>([[_toolbarController view] retain]),
|
| - Hideable, [ToolbarController toolbarDropShadowHeight], 0.0,
|
| + base::scoped_nsobject<UIView>([_toolbarController view]), Hideable,
|
| + [ToolbarController toolbarDropShadowHeight], 0.0,
|
| };
|
| results.push_back(header);
|
| }
|
| if ([_findBarController view]) {
|
| HeaderDefinition header = {
|
| - base::scoped_nsobject<UIView>([[_findBarController view] retain]),
|
| - Overlap, 0.0, kIPadFindBarOverlap,
|
| + base::scoped_nsobject<UIView>([_findBarController view]), Overlap,
|
| + 0.0, kIPadFindBarOverlap,
|
| };
|
| results.push_back(header);
|
| }
|
| @@ -2869,8 +2867,8 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| (StaticHtmlNativeContent*)nativeContent {
|
| if (!IsIPadIdiom() && !FirstRun::IsChromeFirstRun()) {
|
| OverscrollActionsController* controller =
|
| - [[[OverscrollActionsController alloc]
|
| - initWithScrollView:[nativeContent scrollView]] autorelease];
|
| + [[OverscrollActionsController alloc]
|
| + initWithScrollView:[nativeContent scrollView]];
|
| [controller setDelegate:self];
|
| OverscrollStyle style = _isOffTheRecord
|
| ? OverscrollStyle::REGULAR_PAGE_INCOGNITO
|
| @@ -2961,12 +2959,12 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| withError:(NSError*)error
|
| isPost:(BOOL)isPost {
|
| ErrorPageContent* errorPageContent =
|
| - [[[ErrorPageContent alloc] initWithLoader:self
|
| - browserState:self.browserState
|
| - url:url
|
| - error:error
|
| - isPost:isPost
|
| - isIncognito:_isOffTheRecord] autorelease];
|
| + [[ErrorPageContent alloc] initWithLoader:self
|
| + browserState:self.browserState
|
| + url:url
|
| + error:error
|
| + isPost:isPost
|
| + isIncognito:_isOffTheRecord];
|
| [self setOverScrollActionControllerToStaticNativeContent:errorPageContent];
|
| return errorPageContent;
|
| }
|
| @@ -2986,14 +2984,14 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| std::string url_host = url.host();
|
| if (url_host == kChromeUINewTabHost || url_host == kChromeUIBookmarksHost) {
|
| NewTabPageController* pageController =
|
| - [[[NewTabPageController alloc] initWithUrl:url
|
| - loader:self
|
| - focuser:_toolbarController
|
| - ntpObserver:self
|
| - browserState:_browserState
|
| - colorCache:_dominantColorCache
|
| - webToolbarDelegate:self
|
| - tabModel:_model] autorelease];
|
| + [[NewTabPageController alloc] initWithUrl:url
|
| + loader:self
|
| + focuser:_toolbarController
|
| + ntpObserver:self
|
| + browserState:_browserState
|
| + colorCache:_dominantColorCache
|
| + webToolbarDelegate:self
|
| + tabModel:_model];
|
| pageController.swipeRecognizerProvider = self.sideSwipeController;
|
|
|
| // Panel is always NTP for iPhone.
|
| @@ -3020,20 +3018,20 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| const std::string& filename = GetTermsOfServicePath();
|
|
|
| StaticHtmlNativeContent* staticNativeController =
|
| - [[[StaticHtmlNativeContent alloc]
|
| + [[StaticHtmlNativeContent alloc]
|
| initWithResourcePathResource:base::SysUTF8ToNSString(filename)
|
| loader:self
|
| browserState:_browserState
|
| - url:GURL(kChromeUITermsURL)] autorelease];
|
| + url:GURL(kChromeUITermsURL)];
|
| [self setOverScrollActionControllerToStaticNativeContent:
|
| staticNativeController];
|
| nativeController = staticNativeController;
|
| } else if (url_host == kChromeUIOfflineHost) {
|
| StaticHtmlNativeContent* staticNativeController =
|
| - [[[OfflinePageNativeContent alloc] initWithLoader:self
|
| - browserState:_browserState
|
| - webState:webState
|
| - URL:url] autorelease];
|
| + [[OfflinePageNativeContent alloc] initWithLoader:self
|
| + browserState:_browserState
|
| + webState:webState
|
| + URL:url];
|
| [self setOverScrollActionControllerToStaticNativeContent:
|
| staticNativeController];
|
| nativeController = staticNativeController;
|
| @@ -3042,15 +3040,14 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| // still in the sandbox.
|
| NSString* filePath = [ExternalFileController pathForExternalFileURL:url];
|
| if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
|
| - nativeController = [[[ExternalFileController alloc]
|
| - initWithURL:url
|
| - browserState:_browserState] autorelease];
|
| + nativeController =
|
| + [[ExternalFileController alloc] initWithURL:url
|
| + browserState:_browserState];
|
| }
|
| } else {
|
| DCHECK(![self hasControllerForURL:url]);
|
| // In any other case the PageNotAvailableController is returned.
|
| - nativeController =
|
| - [[[PageNotAvailableController alloc] initWithUrl:url] autorelease];
|
| + nativeController = [[PageNotAvailableController alloc] initWithUrl:url];
|
| if (url_host == kChromeUIHistoryFrameHost) {
|
| base::mac::ObjCCastStrict<PageNotAvailableController>(nativeController)
|
| .descriptionText = l10n_util::GetNSStringFWithFixup(
|
| @@ -3201,7 +3198,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| withFileExtension:(NSString*)fileExtension {
|
| switch ([PHPhotoLibrary authorizationStatus]) {
|
| // User was never asked for permission to access photos.
|
| - case PHAuthorizationStatusNotDetermined:
|
| + case PHAuthorizationStatusNotDetermined: {
|
| [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
|
| // Call -saveImage again to check if chrome needs to display an error or
|
| // saves the image.
|
| @@ -3210,6 +3207,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| withFileExtension:fileExtension];
|
| }];
|
| break;
|
| + }
|
|
|
| // The application doesn't have permission to access photo and the user
|
| // cannot grant it.
|
| @@ -3228,7 +3226,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| // The application has permission to access the photos.
|
| default: {
|
| web::WebThread::PostTask(
|
| - web::WebThread::FILE, FROM_HERE, base::BindBlock(^{
|
| + web::WebThread::FILE, FROM_HERE, base::BindBlockArc(^{
|
| [self saveImage:data withFileExtension:fileExtension];
|
| }));
|
| break;
|
| @@ -3264,7 +3262,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
|
|
| // Cleanup the temporary file.
|
| web::WebThread::PostTask(
|
| - web::WebThread::FILE, FROM_HERE, base::BindBlock(^{
|
| + web::WebThread::FILE, FROM_HERE, base::BindBlockArc(^{
|
| NSError* error = nil;
|
| [[NSFileManager defaultManager] removeItemAtURL:fileURL
|
| error:&error];
|
| @@ -3909,8 +3907,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| CGRect cardFrame = {frame.origin, cardSize};
|
|
|
| CardView* card =
|
| - [[[CardView alloc] initWithFrame:cardFrame isIncognito:_isOffTheRecord]
|
| - autorelease];
|
| + [[CardView alloc] initWithFrame:cardFrame isIncognito:_isOffTheRecord];
|
| card.closeButtonSide = IsPortrait() ? CardCloseButtonSide::TRAILING
|
| : CardCloseButtonSide::LEADING;
|
| [_contentArea addSubview:card];
|
| @@ -4430,7 +4427,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| base::WeakNSObject<Tab> weakTab(tab);
|
| base::WeakNSObject<BrowserViewController> weakSelf(self);
|
| web::JavaScriptResultBlock completionHandlerBlock = ^(id result, NSError*) {
|
| - base::scoped_nsobject<Tab> strongTab([weakTab retain]);
|
| + base::scoped_nsobject<Tab> strongTab(weakTab);
|
| if (!strongTab)
|
| return;
|
| if (![result isKindOfClass:[NSString class]])
|
| @@ -4734,8 +4731,8 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| configurationForContainerSize:panelContainerSize
|
| horizontalSizeClass:self.traitCollection.horizontalSizeClass];
|
| }
|
| - ContextualSearchPanelView* newPanel = [[[ContextualSearchPanelView alloc]
|
| - initWithConfiguration:config] autorelease];
|
| + ContextualSearchPanelView* newPanel =
|
| + [[ContextualSearchPanelView alloc] initWithConfiguration:config];
|
| [newPanel addMotionObserver:self];
|
| [newPanel addMotionObserver:_contextualSearchMask];
|
| return newPanel;
|
| @@ -5022,10 +5019,9 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver {
|
| // Dismiss current alert.
|
| [_alertCoordinator stop];
|
|
|
| - _alertCoordinator.reset(
|
| - [[_dependencyFactory alertCoordinatorWithTitle:title
|
| - message:message
|
| - viewController:self] retain]);
|
| + _alertCoordinator.reset([_dependencyFactory alertCoordinatorWithTitle:title
|
| + message:message
|
| + viewController:self]);
|
| [_alertCoordinator start];
|
| }
|
|
|
|
|