虽然这是一个非常基本的问题,但在stackoverflow.com上阅读了这么多文档和问题后,我仍有一些疑问。
我想知道为什么要将一些实例变量声明为属性。
MYViewController.h
@interface MyViewController : UIViewController {
UIButton *btn;
NSString *name;
}
@property (nonatomic, retain) UIButton *btn;
@property (nonatomic, retain) NSString *name;
MyViewController.m
@implementation MyViewController
@synthesize btn;
-(void) viewDidLoad()
{
[btn setTitle:@"Hello" forState:UIControlstaeNormal]; //this is first way where there is no need to declare btn as property
[self.btn setTitle:@"Hello" forState:UIControlstaeNormal]; //this is second way where we do need to decalre btn as property as we are accessing it through self
//Setting value of name
name = @"abc"; //this is first way where there is no need to declare name as property
[self setName:@"abc"; //this is second way where we do need to declare name as property as we are accessing its aetter method through self
}
现在在上面的代码中我想知道什么时候我们可以使用btn变量的getter / setter方法而不将它声明为属性然后需要将它声明为属性,哪个是设置值的更好方法名称”。
在某处我读到当你想要访问我的其他类对象的实例变量时,你应该将它们声明为实例变量。这是我们应该将它们声明为属性的唯一情况。
基本上我对在哪些情况下将实例变量声明为属性感到困惑。
请建议。 提前谢谢。
答案 0 :(得分:3)
简而言之,除非您愿意,否则不必将实例变量声明为属性。 您将变量声明为属性,以便自动生成getter和setter方法。在您的属性声明中,您可以指定您希望如何设置它们(保留vs assign,原子与非原子)。然后,使用@synthesize指令生成getter和setter。 因此,再次说明,使用属性没有正确或错误的方法。有些人从不使用它们,有些人将每个变量都用作属性。这完全取决于你。
答案 1 :(得分:1)
通常,你会使用它们,因为:
1)该属性属于类
的公共接口 当类需要公开给定方法时使用。缺点是客户端和子类可能滥用公共接口(所有objc方法都是公共的,可见的),除非你小心隐藏这些细节(这有时也是一种痛苦)。有时为了达到你需要的类接口(具有适当的可见性水平),你不得不顺利完成任务。
2)你想要自动生成的访问者
实现非专用访问器很繁琐,而且容易出错。最好节省时间,让编译器为你生成它们。
3)记录行为
有时最好编写@property (copy) NSString * title;
而不是过度记录预期结果。
4)更严格的选择器与点语法匹配
编译器执行更严格的选择器匹配。如果可能的话,我更愿意在汇编时发现错误/问题。
5)强制子类使用它们而不是直接处理ivars
objc ivars默认受保护。你经常希望它们是私有的(取决于类的使用和分布方式,或者只是为了确保子类正确使用基类)。
这有很多原因。线程和维护是最重要的。
如果你将ivar声明为private并为子类提供一个属性来使用,那么子类被强制在它们的实现中使用该属性(尽管有些方法可以作弊)而不是让它们直接访问ivar
所以...它最终取决于您的偏好,以及您所使用的界面与您的类的实现细节。我不认为这里有一个严格的规则 - 较少的邪恶和便利是关键的动机。