为什么我们要在.m文件中创建私有属性,而在iOS中可以通过简单的实例变量完成相同的工作



我知道创建任何实例的私有属性比如

@property (nonatomic, retain)  NSString * mystring

在实现文件将只是创建它的私人,不会在类的外部可见。它可以在同一个类或文件中访问。我的问题是为什么我们要为这些实例创建属性因为我们可以简单地创建一个私有实例变量,像这样

@Private NSString * mystring; 

即使在类之外也无法访问。为什么我们创建私有属性作为创建简单的私有实例来服务于p?任何帮助澄清我的概念是感激…谢谢!

第二种情况只创建一个变量,而第一种情况创建一个属性。属性由getter和setter方法组成,它们对自动为您创建的相关变量进行操作。

的例子:

@property (nonatomic, copy)  NSString *name; //declaration of property
// this creates behind the scenes a variable,
NSString *_name;
// a getter,
-(NSString *) name {
   return _name;
}
// and a setter
-(void) setName:(NSString *)name {
   [_name release];
   _name = nil;
   _name = [name copy];
}

当您执行myObject.name = @"James"时,将自动调用上面的setName:方法,并执行该方法中的代码。相反,如果您将属性name声明为一个简单的变量,那么就不会有方法调用,也不会执行额外的代码。

请注意,为您自动创建的setter负责引用计数和字符串复制,正如您在属性声明中所要求的那样。您指定的另一个关键字(nonatomic)也会影响自动生成的代码,并控制您的属性是否是线程安全的。

您可以重写自动生成属性的setter或getter,以添加额外的功能。例如,您可以重写上述name属性的setter,以便在复制传递的值之前将第一个字母大写。

最后,使用属性而不是简单的变量允许你的代码利用Objective-C的基础设施,允许它集成KVC/KVO和其他类似的功能。

相关内容

最新更新