我想了解如何设置属性(访问器)的参数。初始化器,属性,访问器和复制/保留/只读
我从一个Kal日历的例子中拿了下面的代码。
// Holiday.h
@interface Holiday : NSObject
{
NSDate *date;
NSString *name;
NSString *country;
}
@property (nonatomic, retain, readonly) NSDate *date;
@property (nonatomic, retain, readonly) NSString *name;
@property (nonatomic, retain, readonly) NSString *country;
- (id)initWithName:(NSString *)name country:(NSString *)country date:(NSDate *)date;
@end
// Holiday.m
#import "Holiday.h"
@implementation Holiday
@synthesize date, name, country;
- (id)initWithName:(NSString *)aName country:(NSString *)aCountry date:(NSDate *)aDate
{
if ((self = [super init])) {
name = [aName copy];
country = [aCountry copy];
date = [aDate retain];
}
return self;
}
- (void)dealloc
{
[date release];
[name release];
[country release];
[super dealloc];
}
@end
1)属性设置为retain
,但由于二传手不能使用retain
使得这里没有任何意义。
2)另外,在initWithName
方法中,值设置为copy
。为什么不直接用copy
定义属性并使用访问器方法?
@property (nonatomic, copy) NSString *name;
// ...
self.name = aName;
3)我需要readonly
吗?我不知道他们为什么在这里使用。如果我将copy
与设置器一起使用,则readonly
禁止我设置该值,因为没有设置器。
4)在initWithName
方法中有时使用copy
,有时使用retain
。我建议在这里始终使用copy
,因为这个值不应该在以后修改。
5)我能记住的是,它是确定在dealloc
方法initWithName
和release
copy
/retain
。
那么你会如何建议在这个例子中使用retain
,copy
和readonly
?
** nonatomic **保留属性只是返回指针。他们**不**做保留,autorelease的事情。请参阅文档http://developer.apple的**原子性**部分。com/library/ios /#documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html – JeremyP 2010-10-28 15:56:34
@JeremyP:好的呼叫。不在非原子访问器中'[[保留] autorelease]'的决定是有道理的:如果你想要保持比当前runloop周期更长的值,你应该自己保留它。如果你使用'nonatomic',你基本上是说线程安全不是问题。如果你不必担心线程安全性,那么当你使用来自访问器的返回值时,除了你的代码之外,没有任何代码会被执行,所以访问器不需要执行'[[foo retain] autorelease] 。 – 2010-10-28 16:04:27
@Jeremy:我甚至会说使用非原子意味着你说健壮不是一个问题 - 或者比性能更不重要。如果没有首先分析代码,将属性设置为非原子计数在我的书中算是过早的优化。 – JeremyP 2010-10-28 16:15:53