@在Objective-c中合成?
测试h@在Objective-c中合成?,objective-c,Objective C,测试h NSString *name; @property(nonatomic,retain) NSString *name; test.m @synthesize name; 在这里,我们为什么要在属性和.m文件中使用非原子,保留,为什么要使用@synthetic 请回答, 非原子的被详细描述 retain表示当该值设置为除nil以外的任何值时,将保留该属性。还有其他选项,如复制和分配。通常,可以复制的对象类型应该使用copy,如NSStringassign仅设置指针值 @synthesi
NSString *name;
@property(nonatomic,retain) NSString *name;
test.m
@synthesize name;
在这里,我们为什么要在属性和.m文件中使用非原子,保留,为什么要使用@synthetic
请回答,
非原子的被详细描述
retain表示当该值设置为除nil以外的任何值时,将保留该属性。还有其他选项,如复制和分配。通常,可以复制的对象类型应该使用copy,如NSString
assign仅设置指针值
@synthesis删除属性的getter和setter方法,这是非原子和保留工作所必需的
另外,如果使用保留或复制,请确保在解除锁定
方法中释放对象
- (void)dealloc {
[name release];
[super dealloc];
}
nonatomic
表示设置属性不是线程安全的,retain
表示保留新值(并释放旧值),而@synthesis
实际创建属性所需的方法。在本例中,其计算结果如下:
- (NSString *)name {
// Method "name", returning content of variable "name".
return name;
}
- (void)setName:(NSString *)newName {
[newName retain];
[name release];
name = newName;
// Also some magic for KVO is added here.
}
您的标题与您的问题不匹配。
非原子
与线程安全性没有多大关系。这只是意味着,在线程化环境中,您将始终获得一个可行的值。不保证它是否正确(即原子性不是一个事务系统)。这篇文章写得不错,但当你真的不需要复制对象时,为什么你要复制对象呢?特别是当您使用不可变对象(如NSString)时,复制只会浪费内存。到目前为止,我很少发现需要复制。@DarkDust:每个NSMutableString都是有效的NSString。你不想意外地存储其中的一个,然后让它在你下面更改。至少实现复制的大多数对象都是可变的。因此,以这种方式声明所有属性是一个好主意。另外,作为一种优化,NSString(不可变版本)仅在您告诉它复制时保留。@bbum:谢谢您的澄清。我一直认为当使用atomic+Synthesis时,getter返回的指针值是线程安全的。它是安全的,因为您将返回有效的内容。考虑您有firstName
、lastName
和fullName
(这两个属性组合在一起)属性。没有多少代码< @属性>代码>原子性将防止设置名字,然后姓,而第二个线程在中间调用全名。