我正在学习Objective-C并且很好奇。我可以在这些地方创建一个NSString
的对象,请提供其他任何对象。对我来说,他们都做同样的事情。我不知道它们之间有什么区别。它存放在哪里?我从哪里可以访问它?有什么好处?
1)
// .h
@interface ...
@property (strong,nonatomic) NSString *text;
@end
2)
// .h
@interface ... {
NSString *text
}
@end
3)
// .m
@interface ... ()
@property (strong,nonatomic) NSString *text;
@end
答案 0 :(得分:1)
首先,我的答案是基于最新的Clang编译器,旧版本的工作略有不同。
所以,你不是创建对象。你甚至没有声明其中两个对象。
在第一种情况下,您实际上是告诉编译器您需要公开类型为text
的名为NSString
的属性。编译器的作用是为您_text
声明一个实例变量(顺便说一下,你可以顺利访问它)以及获取和设置该实例变量所需的方法。正如您所看到的,存储仍然是内置的,您只需为您设置getter和setter。
在第二种情况下,您实际上是在自己声明一个实例变量(ivar),就像编译器使用_text
一样。它习惯用_
作为前缀。存储仍然是内部的。最重要的是,您无法从外部访问您的ivar,因为它没有getter或setter,隐式声明为@private
。
在第三种情况下,您创建一个匿名类别(因此为空括号),它会向您的类添加属性。存储的时间有点难/更难以解释,如果您对此感到好奇,可以搜索Apple文档,查看类别是什么等等。在这种情况下,你只能从你的班级中访问你的财产,这使得它在某种程度上是多余的(吸气剂和制定者),你可以将它宣布为ivar。
你也可以像这样声明你的ivars:
@interface GenericViewController : UIViewController{
NSString * text;
}
@end
@implementation GenericViewController{
NSString * text;
}
@end
以上两者都具有本地存储和私有可见性(无法从外部访问)。两者之间的区别在于隐式隐藏了实现中声明的实例变量,并且无法使用@ public,@ protected和@private更改可见性。如果使用这些指令,则不会出现编译器错误,但会被忽略。