菜鸟教程小白 发表于 2022-12-13 10:52:45

ios - 使用@dynamic 在类别中添加@property 时getter/setter 如何实现


                                            <p><p>我将一个属性添加到我的类别并在我的类别实现中使用@dynamic。
看起来效果不错。</p>

<pre><code>@interface aClass (Properties)
@property (nonatomic, readonly) NSString *p;
@end

@implementation aClass (Properties)
@dynamic p;
@end
</code></pre>

<p>我知道@dynamic 的意思是告诉编译器不要自动合成 getter 和 setter 方法。但是为什么上面的代码可以在没有我的 getter/setter 实现的情况下工作?
它是由运行时提供的吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这将编译(并链接,前提是您有一个实际的 <code>@interface</code> 和 <code>@implementation</code> 而不仅仅是一个类别)。但如果你尝试使用 getter,它会在运行时崩溃。</p>

<p>当您传递 <code>@dynamic</code> 时,您 promisegetter 将在运行时可用(而不是 setter;这是 <code>readonly</code>)。如果您尝试在运行时使用 getter,您会发现您的 promise 没有实现,并且您会因“无法识别的选择器”消息而崩溃。 <code>@dynamic</code> 说“相信我”。然后你必须值得信赖。</p>

<p>(请注意,类应始终以大写字母开头。)</p>

<hr/>

<p>啊,你提到它是 CALayer。这改变了一切。 CALayer 很神奇。好吧,不是魔术,但绝对是特别的。 CALayer 捕获未处理的选择器并将它们转换为动态属性(我认为将值存储在字典中),就像您所看到的那样。这是一个非常聪明的想法,在 10.5 中,我们中的一些人认为这可能是“新方式”。 (它是 Core Data 工作方式的自然扩展。)我认为 Apple 发现它太聪明了,因为他们没有将它传播到其他类。</p>

<p>实际上,几年前在 WWDC 上,我曾与一些 Apple 开发人员讨论过这个问题。我想知道依靠它是否安全。我与之交谈的人没有意识到它在那里,也没有推荐它。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用@dynamic 在类别中添加@property 时getter/setter 如何实现,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/30516819/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/30516819/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用@dynamic 在类别中添加@property 时getter/setter 如何实现