我很难理解如何理解将属性设置为变量和对象的实际用法。我试图阅读许多教程和苹果文档,但我仍然无法理解为什么我们应该使用属性以及为什么我们需要合成属性?考虑到我们宣布
@property(nonatomic,retain) NSString *str;
为什么我们需要声明一个属性。据我所知,我们可以通过您的类访问字符串对象str
。但为什么我们需要在这里创建一个属性?
有人可以帮帮我吗?
答案 0 :(得分:4)
属性通常用于从类外部访问实例变量。
例如,如果你有一个指向你的类的指针,你可以像这样获取/设置属性
someObject.str = @"some string";
你还需要@synthesize
财产,通常是这样的:
@synthesize str = _str;
在该片段中,_str
是属性设置和获取的实例变量。
这些属性基本上只是创建访问器(setter / getters)的快捷方式。
例如,使用您的属性的setter看起来像这样:
- (void)setStr:(NSString *)str {
if(str != _str) {
[_str release];
_str = [str retain];
}
}
并且getter看起来像这样:
- (NSString *)str {
return _str;
}
通过创建属性,可以自动为您创建前两个代码块。
答案 1 :(得分:1)
属性是一个公共接口,它使其他对象能够检查并设置声明变量的对象内的变量值。
你可以通过编写获取和设置变量值的显式方法来实现同样的目的。
请注意,当您接下来时,Objective-C中的属性/合成对实际上是编程人员使用定义良好的模式为您构建这些方法的简写。
因此在objective-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];
答案 2 :(得分:1)
使用属性是Obj-C为程序员提供的工具。
您可以编写包含或不包含属性的程序。
您可以将属性与@synthesize
编译器指令结合使用。
属性声明指示编译器声明getter / setter方法对。 您必须手动编写setter和getter的代码。此属性声明允许您使用点表示法来访问实例变量。编译器会将点表示法转换为适当的getter / setter方法。
您可以使用@synthesize
指令告诉编译器生成getter / setter方法的代码。
使用属性,您必须编写更少的代码,并且可以使用点表示法。 另一种方法,不使用属性,你必须编写getter / setter方法,并且不允许使用点符号。
但你可以用任何一种方式编写程序。因此,您可以使用属性并合成它们。