(十八)[OC高效系列]盡量使用不可變對象

1.盡量減少對象中的可變內(nèi)容

正如 (八) [OC高效系列]理解對象等同性中的第6條所示,把可變內(nèi)容放到collection之后,然后又改變其內(nèi)容,可能會使set的內(nèi)部結(jié)構(gòu)發(fā)生破壞。所以盡量減少對象中的可變內(nèi)容。

2.readonly,readwrite

如果一個屬性對外可讀,對內(nèi)可讀可寫,那么應該在該類的公共接口處聲明readonly,在類擴展中重新聲明為readwrite,比如下面這個類

@interface Person : NSObject

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int  age;
@property (nonatomic,strong) NSDate *birthday;
@property (nonatomic,readonly) NSArray *friends;
- (void)addFriend:(Person *)person;
- (void)removeFriend:(Person *)person;
@end

@interface Person ()
@property (nonatomic,readwrite,strong) NSMutableArray *friends;
@end
@implementation Person
- (instancetype)init
{
    self = [super init];
    if (self) {
        _friends = [NSMutableArray array];
    }
    return self;
}
- (void)addFriend:(Person *)friend{
    if(friend){
        [_friends addObject:friend];
    }
}
- (void)removeFriend:(Person *)friend{
    if(friend){
        [_friends removeObject:friend];
    }
}
@end

這樣用戶如果想添加一個friend或者是刪除一個friend就必須通過person對象本身,這樣容易維持內(nèi)部數(shù)據(jù)的統(tǒng)一性,如果直接將friends暴露出來,friend的修改對象本身并不知道,這樣就很容易出bug

3.不要把可變的collection屬性直接暴露出來

上面的代碼還是有一定的問題,雖然公共的聲明中friends為NSArray,是一個不可變的對象,但實際返回的對象依然是一個NSMutableArray,用戶還是可以通過強制轉(zhuǎn)換來修改。所以我們可以覆寫friends的getter方法

- (NSArray *)friends{
    return [_friends copy];
}

關(guān)于copy,我在 (六) [OC高效系列]弄清楚屬性中也有相關(guān)的介紹

當然你也可以不覆寫這個方法,因為復制也是需要損耗一些性能的。

所以在使用別人的類或者類庫時,盡量使用類本身提供的對屬性的設置方法,而不要繞過這些方法,否則可能會出現(xiàn)數(shù)據(jù)不一致的情況

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容