我有一個包含枚舉屬性的類,我想用plist文件使用方法setValuesForKeysWithDictionary:
來初始化它的實例。但該文件可能包含無效值。該方案如下:
在文件 'MyClass.h':更好的方法來覆蓋原子屬性設置爲ARC和線程安全的Objective-C
typedef NS_ENUM(NSInteger, FruitTag) {
Apple = 0,
Banana = 1,
Orange = 2,
Unknown = 3
};
@interface MyClass : NSObject
@property (strong, nonatomic) NSString *name;
@property FruitTag tag;
@end
plist文件:
<plist version="1.0">
<array>
<dict>
<key>name</key>
<string>Apple</string>
<key>tag</key>
<integer>0</integer>
</dict>
<dict>
<key>name</key>
<string>Banana</string>
<key>tag</key>
<string>1</string>
</dict>
<dict>
<key>name</key>
<string>Pineapple</string>
<key>tag</key>
<string>5</string>
</dict>
</array>
</plist>
正如你看到的,最後的鍵值 '5' 是無效的最大枚舉值是'3'!但方法setValuesForKeysWithDictionary:
只是設置該值,無論是否有效。所以我想重寫setter,但枚舉屬性是原子的!還有一件事是:我希望它的getter和setter在多線程場景中是安全的。有關這兩個思考,我修改了代碼:
在文件 'Myclass.h':
typedef NS_ENUM(NSInteger, FruitTag) {
Apple = 0,
Banana = 1,
Orange = 2,
Unknown = 3
};
@interface MyClass : NSObject
@property (strong, nonatomic) NSString *name;
//@property FruitTag tag;
- (FruitTag)tag;
- (void)setTag:(NSInteger)aTag;
@end
和文件 'Myclass.m' 中:
#import "MyClass.h"
@implementation MyClass
{
FruitTag tag;
}
- (FruitTag)tag
{
@synchronized (self) {
return tag;
}
}
- (void)setTag:(NSInteger)aTag
{
@synchronized (self) {
if ((aTag < Apple) || (aTag > Unknown)) {
tag = Unknown;
} else {
tag = aTag;
}
}
}
- (void)print
{
@synchronized (self) {
NSLog(@"the tag is: %d", tag);
}
}
@end
嗯,它看起來很奇怪,但是在我使用方法setValuesForKeysWithDictionary:
進行測試時工作正常。但我不確定:是否可以?線程安全嗎?任何潛在的風險?或者更好的重寫方式更受歡迎!謝謝!
我不只是加限定詞「非原子」的枚舉屬性,我希望二傳手可以接受NSInteger的參數,而不是枚舉類型! – kenmux 2014-12-19 03:39:36