菜鸟教程小白 发表于 2022-12-13 08:30:51

ios - 是否建议为只读合成属性定义 ivars?


                                            <p><p>我发现很多时候我想要一个综合的只读属性,我只是根据其他变量来实现该属性的 getter 方法,而不需要 ivar,例如 (<em >注意</em>:我在界面中定义 ivars,因为我使用的是 OmniGraffle UML 软件,它不能识别由合成属性自动生成的 ivars):</p>

<pre><code>
@界面编辑器:UIView {
    BOOL _wordWrap;
    BOOL _showLineNumbers;
    NSDictionary *_options;
}

@property (nonatomic) BOOL wordWrap;
@property (nonatomic) BOOL showLineNumbers;
@property (nonatomic, copy, readonly) NSDictionary *options;

@结尾
</code>
</pre>

<pre><code>
@实现编辑器

@synthesize wordWrap = _wordWrap;
@synthesize showLineNumbers = _showLineNumbers;
@synthesize 选项 = _options;

- (NSDictionary *)options {
    返回 @{
                @"WordWrap": ,
                @"ShowLineNumbers": ,
            };
}

@结尾
</code>
</pre>

<p>在上面的 <code>Editor</code> 类中,我是否有必要在标题定义中定义 <code>_options</code> ivar 并且 <em>more</em> 重要的是自动- 生成的 ivar 占用符号表中的内存或空间?另外,在这种情况下使用 <code>copy</code>、<code>retain</code> 还是不使用值会更有效吗?只是好奇。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>首先:停止将您的 ivar 声明放在 <code>@interface</code> 中。它们属于您的 <code>@implementation</code>。见 <a href="https://stackoverflow.com/a/13573236/77567" rel="noreferrer noopener nofollow">this answer</a>详细解释。</p>

<p>无论如何,鉴于您编写的内容,您的 <code>@synthesize options = _options</code> 无效。</p>

<p><code>@synthesize</code> 有两种可能的效果:</p>

<ol>
<li><p>如果你的类没有实例变量,它会添加一个名为 <code>_options</code> 的实例变量。</p></li>
<li><p>它会生成一个 getter 方法,<code>options</code>,如果你的类没有名为 <code>options</code>。</p></li>
</ol>

<p>由于您手动定义了实例变量和 getter,因此 <code>@synthesize</code> 什么也不做。您可以完全删除它而不改变程序的含义。</p>

<p>在只读属性上指定 <code>copy</code> 无效。 <code>copy</code> 和 <code>retain</code>(或者,在 ARC 下更准确地说,<code>strong</code>)属性只影响生成的 setter 方法,编译器不会生成<code>readonly</code> 属性的 setter 。 (如果您在类扩展中将属性更改为 <code>readwrite</code>,则 <code>copy</code> 很重要。)</p>

<p>是的,<code>_options</code> ivar 占用了内存(对于 <code>Editor</code> 的每个实例)和符号表中的空间。
由于您没有使用 <code>_options</code> ivar,因此您应该完全删除它。您还应该完全删除 <code>@synthesize</code>,这样编译器就不会为您生成 <code>_options</code> ivar。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 是否建议为只读合成属性定义 ivars?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/24663176/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/24663176/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 是否建议为只读合成属性定义 ivars?