我很难理解将属性设置为变量和对象的实际用法。我尝试阅读许多教程和Apple文档,但我仍然无法理解为什么我们应该使用属性以及为什么我们需要合成属性?考虑到我们声明
@property(nonatomic,retain) NSString *str;
为什么我们需要声明一个属性。据我了解,我们可以通过您的类访问字符串对象str
。但是为什么我们需要在这里创建一个属性呢?
有人可以帮我吗?
属性通常用于从类外部访问实例变量。
例如,如果你有一个指向你的类的指针,你可以像这样获取/设置属性
someObject.str = @"some string";
您还必须@synthesize
属性,通常如下所示:
@synthesize str = _str;
在该代码段中,_str
是属性设置和获取的实例变量。
这些属性本质上只是创建访问器(setter/getter)的快捷方式。
例如,使用您的属性的二传手如下所示:
- (void)setStr:(NSString *)str {
if(str != _str) {
[_str release];
_str = [str retain];
}
}
吸气剂看起来像这样:
- (NSString *)str {
return _str;
}
通过创建属性,将自动为您创建前两个代码块。
属性是一个公共接口,它使其他对象能够检查和设置声明变量的对象内的变量值。
您可以通过编写获取和设置变量值的显式方法来实现相同的目标。
请注意,当你深入了解它时,Objective-C 中的属性/合成对实际上是编译器使用定义良好的模式为你构建这些方法的简写。
因此在目标-c
@property(nonatomic,retain) NSString *str;
....
synthesize str;
...
最终创建两个定义为:
void setStr:(NSString*) value;
NSString* str;
而那篇写作
Object.str = @"Hello world";
NSString* value = Object.str;
分别转换为:
[Object setStr:@"Hello world"];
NSString* value = [Object str];
属性的使用是 Obj-C 提供给程序员的一种工具。
您可以编写带或不带属性的程序。
可以将属性与 @synthesize
编译器指令结合使用。
属性声明指示编译器声明一对 getter/setter 方法。您必须手动对二传手和吸气器进行编码。此属性声明允许您使用点表示法来访问实例变量。编译器会将点表示法转换为适当的 getter/setter 方法。
您可以使用 @synthesize
指令告诉编译器为 getter/setter 方法生成代码。
使用属性,您必须编写更少的代码,并且可以使用点表示法。另一种方式,不使用属性,你必须编写getter/setter方法,并且不允许使用点符号。
但是你可以用任何一种方式编写程序。因此,由您使用属性并合成它们。