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)的介紹
當然你也可以不覆寫這個方法,因為復制也是需要損耗一些性能的奉瘤。
所以在使用別人的類或者類庫時勾拉,盡量使用類本身提供的對屬性的設(shè)置方法,而不要繞過這些方法盗温,否則可能會出現(xiàn)數(shù)據(jù)不一致的情況