类接口中的 ivar 与声明属性(现代运行时)创建的 ivar 有什么区别吗?

发布于 2024-11-01 04:36:00 字数 407 浏览 1 评论 0原文

在现代运行时。 您可以声明属性,而无需在接口中声明相同名称的 ivar 就像

@interface MyClass: NSObject
{
     NSString *str2;
}
@property (retain) NSString *str1;
@property (retain) NSString *str2;
@end

我知道的,这会自动为您生成一个 str1 ivar,因为在实现中,您可以访问 self.str1 或纯粹的 str1。

但我的问题是,str1和str2有什么区别吗?

如果它们相同,为什么类扩展(没有名称的类别)允许添加一个新的声明属性,该属性也会生成 ivar 但不允许在类扩展中添加 ivar 实例?(我知道 LLVM 2.0 或更高版本允许但 gcc 没有)

In the modern runtime.
you can declare property without having the same name ivar already declared in the interface
like

@interface MyClass: NSObject
{
     NSString *str2;
}
@property (retain) NSString *str1;
@property (retain) NSString *str2;
@end

And i know ,this would generate a str1 ivar automatically for you since in the implementation, you can access both self.str1 or purely str1.

But my question is that, is there any difference between str1 and str2?

If they are the same, why would class extension (a catagory with no name) allow to add a new declared property that would also generate an ivar but not allowing adding a ivar instance in a class extension?(I know LLVM 2.0 or later allows this but gcc don't)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

魔法少女 2024-11-08 04:36:00

str1 和 str2 是相同的,因为当您使用 @property 时,setter 和 getter 方法会自动生成,但如果之前没有存储值的实例变量,也会创建一个同名的实例变量。例如,在您的代码中,编译器会说:“看来我必须创建 NSString 类的实例,因为程序员想要访问它。”但对于 str2,已经创建了一个实例变量来存储数据,因此编译器不需要创建一个实例变量。

就我个人而言,我的代码就像您对 str1 所做的那样,而不是在 @interface 中声明变量。

希望这有帮助。

另请查看:ivar 的用途是什么属性存在吗?

str1 and str2 are the same because when you use @property setter and getter methods are automatically generated, but also created is an instance variable of the same name if there is no previously existing one to store values. For example, in your code, the compiler will say, "It appears that I have to create an instance of class NSString because the programmer wants to access it." But with str2, an instance variable is already created to store data so there is no need for the compiler to create one.

Personally, I code like you did with str1, not declaring the variable in @interface.

Hope this helps.

Also check out this: What's the purpose of an ivar when a property exists?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文