ios - Objective-C 中的属性
<p><pre><code>Line 1: First.h
Line 2: @property (nonatomic, retain) NSString *name;
Line3: First.m
Line4: @synthesize name;
Line5: -(void)viewDidLoad()
Line6: {
Line7: name = ;
Line8: OR
Line9: self.name = [initWithString:@"Hello"];
Line 10: OR
Line 11:}
Line 12:-(void)dealloc()
Line 13: {
Line 14: ;
Line 14: }
</code></pre>
<p>问题一:<br/>
如果我遵循第 7 行,一切都很好,如果我使用第 9 行,则存在内存泄漏。据我所知 self 指向当前对象,如果我使用 <code>self.object</code> 或只是 <code>object</code> 没有更多区别。</p>
<p>问题2:如果我使用了</p>
<pre><code>@synthesize name = _name;
</code></pre>
<p>那么哪一个是设置name的值,哪一个是获取值呢?区别:</p>
<pre><code>name = ;
OR
self.name = ;
OR
_name = ;
</code></pre>
<p>问题3:<br/>
如果我创建任何属性,是否需要在分配的内存中分配显示内存泄漏?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><blockquote>
<p>QUESTION 1: if I follow line number 7 everything is fine and if I used line number 9 Memory leakage is there. As I know self is point to current object and if I used self.object or simply object no more difference.</p>
</blockquote>
<pre><code>Line7: name = ;
Line8: OR
Line9: self.name = [initWithString:@"Hello"];
</code></pre>
<p>在第 7 行,您使用了一个方便的构造函数,它返回一个自动释放的对象并将对象 <strong>直接</strong> 分配给您的 <code>name</code> ivar;现在,可以将自动释放的对象分配给保留属性,但是将自动释放的对象直接分配给 ivar 而不显式保留它是不正确的:</p>
<pre><code>name = [ retain];
</code></pre>
<p>在第 9 行,您使用了 alloc/init,它为您提供了一个保留对象:将此类对象直接分配给 ivar 是正确的,但您应该在分配给保留属性之前自动释放它,例如:</p>
<pre><code>self.name = [[initWithString:@"Hello"] autorelease];
</code></pre>
<p>您可以根据对象保留计数来推断这一点:</p>
<ol>
<li><p>方便的构造函数将保留计数设置为 1,但稍后将通过框架完成的 <code>release</code> 调用自动减少;</p></li>
<li><p>alloc/init 会给你一个保留计数 1,除非你明确调用 <code>release</code>;</p></li>
<li><p>当一个对象的保留计数变为 0 时,它将被释放。</p></li>
</ol>
<p>根据保留计数进行推理只是查看整个内存管理问题并了解框架深处发生了什么的一种方式;不过,这绝不是分析对象生命周期的正确方法。</p>
<blockquote>
<p>then which one is for setting the value of name and which one is for get the value? Difference between <code>name = ;</code> OR <code>self.name = ;</code> OR <code>_name = ;</code></p>
</blockquote>
<pre><code>name = ;
</code></pre>
<p>和</p>
<pre><code>_name = ;
</code></pre>
<p>在给定的两种情况下都是一样的。这将绕过属性 setter(/getter) 方法并直接分配给 ivar。在这种情况下,您的应用程序迟早会崩溃,因为您将自动释放的对象直接分配给 ivar。这是正确的:</p>
<pre><code>_name = [ retain];
</code></pre>
<p>或</p>
<pre><code>_name = [ initWithString:@"Hello"];
</code></pre>
<p>请注意,在将 ivar 声明为 <code>_name</code> 的程序中,不能使用 <code>name</code> 来引用它;如果您声明 <strong>only</strong> 属性而不像问题 1 那样显式指定 ivar,则可以使用 <code>name</code> 直接引用 ivar(在这种情况下,<code>name </code> 将是编译器为您自动生成的 ivar。</p>
<p>另一方面:</p>
<pre><code>self.name = ;
</code></pre>
<p>将使用属性访问器方法(实际上是setter);由于您的属性被声明为 <code>retain</code>,因此可以将便捷构造函数 <code>stringWithString:</code> 返回的自动释放变量分配给它。</p>
<blockquote>
<p>QUESTION 3: if I create any property is there any need to alloc in the memory as I allocated showing the memory leakage.</p>
</blockquote>
<p>这对我来说不是很清楚。</p>
<p>关于内存管理基础知识的好文档是:<a href="https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html" rel="noreferrer noopener nofollow">Memory Management Policy</a>还有<a href="https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html" rel="noreferrer noopener nofollow">Practical Memory Management</a>摘自 Apple 的高级内存管理编程指南。</p></p>
<p style="font-size: 20px;">关于ios - Objective-C 中的属性,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/12870892/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/12870892/
</a>
</p>
页:
[1]