Advertisement
Guest User

Untitled

a guest
May 28th, 2015
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.47 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using MonoTouch.MessageUI;
  5. using MonoTouch.UIKit;
  6.  
  7. namespace MyApp
  8. {
  9. public interface ICanCleanUpMyself
  10. {
  11. void CleanUp();
  12. }
  13.  
  14. public static class MemoryUtility
  15. {
  16. public static void ReleaseUIViewWithChildren(UIView view, bool enableSelfCleaning = true)
  17. {
  18. try
  19. {
  20. if (view == null)
  21. return;
  22.  
  23. if (view.Subviews != null)
  24. {
  25. view.Subviews
  26. .ToList()
  27. .ForEach(subview =>
  28. ReleaseUIViewWithChildren(subview, enableSelfCleaning)
  29. );
  30. }
  31.  
  32. ReleaseObject(view, enableSelfCleaning);
  33. }
  34. catch (Exception exception)
  35. {
  36. // Logging ...
  37. }
  38. }
  39.  
  40. public static void ReleaseObject(IDisposable disposableObject, bool enableSelfCleaning = true)
  41. {
  42. try
  43. {
  44. if (disposableObject == null)
  45. return;
  46.  
  47. ReleaseUIImageView(disposableObject);
  48. ReleaseUIButton(disposableObject);
  49. ReleaseUIView(disposableObject);
  50. ReleaseUINavigationController(disposableObject);
  51. ReleaseUIPageviewController(disposableObject);
  52. ReleaseUIViewController(disposableObject);
  53.  
  54. if (enableSelfCleaning)
  55. LetObjectCleanUpItself(disposableObject);
  56.  
  57. disposableObject.Dispose();
  58. }
  59. catch (Exception exception)
  60. {
  61. // Logging ...
  62. }
  63. }
  64.  
  65. public static void ReleaseObject<T>(WeakReference<T> weakReference,
  66. bool enableSelfCleaning = true) where T : class, IDisposable
  67. {
  68. T reference;
  69. if (weakReference == null ||
  70. !weakReference.TryGetTarget(out reference) || reference == null)
  71. return;
  72.  
  73. ReleaseObject(reference, enableSelfCleaning);
  74. }
  75.  
  76. public static void ReleaseUITableViewCell(IDisposable disposableObject)
  77. {
  78. try
  79. {
  80. var cell = disposableObject as UITableViewCell;
  81.  
  82. if (cell == null)
  83. return;
  84.  
  85. ReleaseUIViewWithChildren(cell.BackgroundView);
  86. ReleaseUIViewWithChildren(cell.SelectedBackgroundView);
  87. ReleaseUIViewWithChildren(cell.AccessoryView);
  88. ReleaseUIViewWithChildren(cell.ContentView);
  89. }
  90. catch (Exception exception)
  91. {
  92. // Logging ...
  93. }
  94. }
  95.  
  96. public static void ReleaseSubviews(UIView[] subviews)
  97. {
  98. try
  99. {
  100. if (subviews == null || subviews.Length == 0)
  101. return;
  102.  
  103. foreach (UIView subview in subviews)
  104. {
  105. if (subview is UIActivityIndicatorView)
  106. continue;
  107.  
  108. if (subview != null)
  109. ReleaseSubviews(subview.Subviews);
  110.  
  111. ReleaseObject(subview);
  112. }
  113. }
  114. catch (Exception exception)
  115. {
  116. // Logging ...
  117. }
  118. }
  119.  
  120. private static void ReleaseUIButton(IDisposable disposableObject)
  121. {
  122. var button = disposableObject as UIButton;
  123.  
  124. if (button == null)
  125. return;
  126.  
  127. if (button.ImageView != null)
  128. ReleaseUIImageView(button.ImageView);
  129.  
  130. if (button.CurrentBackgroundImage != null)
  131. button.CurrentBackgroundImage.Dispose();
  132.  
  133. if (button.CurrentImage != null)
  134. button.CurrentImage.Dispose();
  135. }
  136.  
  137. private static void ReleaseUIImageView(IDisposable disposableObject)
  138. {
  139. var imageView = disposableObject as UIImageView;
  140.  
  141. if (imageView == null || imageView.Image == null)
  142. return;
  143.  
  144. imageView.Image.Dispose();
  145. imageView.Image = null;
  146. }
  147.  
  148. private static void ReleaseUINavigationController(IDisposable disposableObject)
  149. {
  150. var navigationController = disposableObject as UINavigationController;
  151.  
  152. if (navigationController == null)
  153. return;
  154.  
  155. if (navigationController is MFMailComposeViewController)
  156. return;
  157.  
  158. ReleaseChildControllers(navigationController.ChildViewControllers);
  159. }
  160.  
  161. private static void ReleaseUIPageviewController(IDisposable disposableObject)
  162. {
  163. var pageViewController = disposableObject as UIPageViewController;
  164.  
  165. if (pageViewController == null)
  166. return;
  167.  
  168. var children = pageViewController.ChildViewControllers
  169. .Union(pageViewController.ViewControllers)
  170. .ToList();
  171.  
  172. ReleaseChildControllers(children);
  173.  
  174. pageViewController.RemoveFromParentViewController();
  175. }
  176.  
  177. private static void ReleaseChildControllers(IEnumerable<UIViewController> children)
  178. {
  179. foreach (UIViewController child in children)
  180. {
  181. var baseDialog = child as BaseDialog;
  182.  
  183. if (baseDialog != null)
  184. {
  185. if (!baseDialog.IsDead)
  186. {
  187. baseDialog.DetachEventHandlers();
  188. baseDialog.CleanUpAfterDisappearing();
  189. baseDialog.CleanUp();
  190.  
  191. child.RemoveFromParentViewController();
  192. child.Dispose();
  193. }
  194.  
  195. continue;
  196. }
  197.  
  198. var timelineDialog = child as TimelineDialog;
  199.  
  200. if (timelineDialog != null)
  201. {
  202. timelineDialog.DetachEventHandlers();
  203. timelineDialog.CleanUp();
  204.  
  205. timelineDialog.RemoveFromParentViewController();
  206. timelineDialog.Dispose();
  207.  
  208. continue;
  209. }
  210.  
  211. ReleaseUIViewWithChildren(child.View);
  212. ReleaseObject(child);
  213. }
  214. }
  215.  
  216. private static void ReleaseUIViewController(IDisposable disposableObject)
  217. {
  218. var viewController = disposableObject as UIViewController;
  219.  
  220. if (viewController == null || viewController is UINavigationController || viewController is UIPageViewController)
  221. return;
  222.  
  223. ReleaseUIViewWithChildren(viewController.View);
  224.  
  225. foreach (UIViewController child in viewController.ChildViewControllers)
  226. {
  227. ReleaseObject(child);
  228. }
  229.  
  230. viewController.RemoveFromParentViewController();
  231. }
  232.  
  233. private static void ReleaseUIView(IDisposable disposableObject)
  234. {
  235. var view = disposableObject as UIView;
  236.  
  237. if (view == null || view.Superview == null)
  238. return;
  239.  
  240. view.RemoveFromSuperview();
  241. }
  242.  
  243. private static void LetObjectCleanUpItself(IDisposable dispoableObject)
  244. {
  245. var selfCleaningObject = dispoableObject as ICanCleanUpMyself;
  246.  
  247. if (selfCleaningObject == null)
  248. return;
  249.  
  250. selfCleaningObject.CleanUp();
  251. }
  252. }
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement