Repository navigation
Expand file tree
/
Copy pathExampleRuntimeDebugging_8m-example.html
More file actions
123 lines (123 loc) · 6.83 KB
/
Copy pathExampleRuntimeDebugging_8m-example.html
File metadata and controls
123 lines (123 loc) · 6.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6-nimbuskit"/>
<title>NimbusKit: ExampleRuntimeDebugging.m</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="appledocs.css" rel="stylesheet" type="text/css"/>
<link href="nimbuskit.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-24278774-1']);
_gaq.push(['_setDomainName', 'nimbuskit.info']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<a href="index.html"><img style="float:left" src="nimbus128.png" width="80" height="80" /></a>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">NimbusKit
 <span id="projectnumber">1.2.1 - <a href="http://github.com/jverkoey/nimbus">Fork Nimbus on Github</a> - <a href="http://wiki.nimbuskit.info/">Visit the Nimbus Wiki</a></span>
</div>
<div id="projectbrief">The iOS framework that grows only as fast as its documentation</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6-nimbuskit -->
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('ExampleRuntimeDebugging_8m-example.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">ExampleRuntimeDebugging.m</div> </div>
</div><!--header-->
<div class="contents">
<p>Modifying class methods at runtime can be a very powerful debugging tool. Consider the following example:</p>
<p>You are finding that you have a memory leak with one of your view controllers, but you're not sure where the extra retain is being made. If you swap the retain implementation on UIViewController with your own method then you can set a breakpoint in the method and look at the stack each time retain is called. This method is similar to setting a breakpoint in GDB on the UIViewController's retain method but allows programmatic control over when you want to hit the breakpoint.</p>
<p>This example is part of <a class="el" href="Runtime-Class-Modifications.html">Runtime Class Modifications</a>.</p>
<div class="fragment"><div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// Copyright 2011-2014 NimbusKit</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></div>
<div class="line"><span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></div>
<div class="line"><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><span class="comment">// limitations under the License.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"></div>
<div class="line"><span class="keyword">@interface </span>UIViewController()</div>
<div class="line"></div>
<div class="line">- (id)_retain;</div>
<div class="line"></div>
<div class="line"><span class="keyword">@end</span></div>
<div class="line"></div>
<div class="line"></div>
<div class="line"><span class="keyword">@implementation </span>UIViewController()</div>
<div class="line"></div>
<div class="line">- (id)_retain {</div>
<div class="line"> <span class="comment">// _retain has been swizzled so calling _retain here will actually call retain.</span></div>
<div class="line"> [<span class="keyword">self</span> _retain]; <span class="comment">// Set a breakpoint here.</span></div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keyword">@end</span></div>
<div class="line"></div>
<div class="line"></div>
<div class="line">- (BOOL) application: (UIApplication *)application</div>
<div class="line"> didFinishLaunchingWithOptions: (NSDictionary *)options {</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Swap the default retain implementation with our custom implementation with which we can</span></div>
<div class="line"> <span class="comment">// visually set a breakpoint.</span></div>
<div class="line"> <a name="a0"></a><a class="code" href="Runtime-Class-Modifications.html#gNISwapInstanceMethods">NISwapInstanceMethods</a>([UIViewController <span class="keyword">class</span>], <span class="keyword">@selector</span>(retain), <span class="keyword">@selector</span>(_retain));</div>
<div class="line"></div>
<div class="line">}</div>
</div><!-- fragment --> </div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.6-->
<!-- start footer part -->
<script type="text/javascript" src="widget.js"></script>
</body>
</html>