我想了解如何設置屬性(訪問器)的參數。初始化器,屬性,訪問器和複製/保留/只讀
我從一個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