【iOS - 月總結】開發中遇到的小知識點(2020.04)
1.實時監聽數組的變化
前幾天有一個需求在列表編輯界面需要實時根據選擇的數據進行下面各種按鈕不同狀態的切換,這就需要我們實時監聽數組的變化。
// 第一步 添加監聽
//監聽selectDataArray數量是否發生變化
[self addObserver:self forKeyPath:@"selectDataArray" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
// 第二步 在觀察者方法中監聽
#pragma mark - 觀察者監聽 選中數組變化
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"selectDataArray"]) {
// 做你想做的操作
}
}
// 做到這里你會發現直接addObject或者removeObject不起作用。所以我們應該這樣添加和修改數組中的數據
[[self mutableArrayValueForKey:@"selectDataArray"] addObject:indexPathM];
[[self mutableArrayValueForKey:@"selectDataArray"] removeAllObjects];
2.NSArray和NSMutableArray的賦值
在開發中,我們也經常遇到這樣的問題,在別的類中聲明了一個可變數組的屬性,然后在賦值的時候我們把不可變數組賦值過去。一般來說這樣會有警告,我們很有可能就忽略了。但是這樣會有一個問題,NSArray賦值給NSMutableArray那么數組就會變成不可變數組,我們對數組進行操作的時候就會崩潰。同理NSMutableArray賦值給NSArray那么數組就會變成可變數組。這個問題也是面試中會問到的一個問題,應該多多注意
3.去除警告
已有詳細博客,請參考
4.oc中參數可為空或不可為空的方法和block作為參數可為空獲不可為空
//參數可為空
- (void)testMethod2:(NSString *_nullable)str;
//參數不可為空
- (void)testMethod2:(NSString *_Nonnull)str;
//調用該方法時block可賦值為空[self testMethod:nil];
- (void)testMethod:(void(^ _nullable)(void))handle;
//調用該方法時block不可以可賦值為空[self testMethod:nil];
- (void)testMethod:(void(^ _Nonnull)(void))handle;
5.xib創建的Controller的View初始值就是(600,600)
xib創建的Controller的View初始值就是(600,600), 你可以在viewWillAppear方法中添加創建的HUD, 或者是在viewDidLoad中設置
// View的Frame:
self.view.frame = [UIScreen mainScreen].bounds;
6.取模型數組內屬性組成新的數組
NSArray *array = @[@{
@"name":@"zhang",
@"idStr":@"11"
},
@{
@"name":@"li",
@"idStr":@"12"
},
@{
@"name":@"wang",
@"idStr":@"13"
},
@{
@"name":@"zhao",
@"idStr":@"14"
}
];
NSArray *newArray = [array mutableArrayValueForKeyPath:@"name"];
// 結果
/*
Printing description of newArray:
<NSKeyValueSlowMutableArray 0x600002a415c0>(
zhang,
li,
wang,
zhao
)
*/
這樣會得到name字段屬性值組成的數組
類似的還有MJExtension里面的方法,這里面更加完善。他可以設置一些忽略值,在大數據字典中我們可以直接忽略一些然后取數組,不必一個個輸入所有的選值
/**
* 通過模型數組來創建一個字典數組
* @param objectArray 模型數組
* @return 字典數組
*/
+ (NSMutableArray*)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray;
+ (NSMutableArray*)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys;
+ (NSMutableArray*)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys;
7.解決Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.-
*** Terminating app due to uncaught exception ‘NSGenericException’, reason: ‘*** Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.’
當程序出現這個提示的時候,是因為你一邊便利數組,又同時修改這個數組里面的內容,導致崩潰,網上常見的方法如下:
NSMutableArray * arrayTemp = xxx;
NSArray * array = [NSArray arrayWithArray: arrayTemp];
for (NSDictionary * dic in array) {
if (condition){
[arrayTemp removeObject:dic];
}
}
這種方法就是在定義一個一模一樣的數組,便利數組A然后操作數組B。
NSMutableArray *tempArray = [[NSMutableArray alloc]initWithObjects:@"12",@"23",@"34",@"45",@"56", nil];
[tempArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isEqualToString:@"34"]) {
*stop = YES;
if (*stop == YES) {
[tempArray replaceObjectAtIndex:idx withObject:@"3333333"];
}
}
if (*stop) {
NSLog(@"array is %@",tempArray);
}
}];
利用block來操作,根據查閱資料,發現block便利比for便利快20%左右,這個的原理是這樣的:
找到符合的條件之后,暫停遍歷,然后修改數組的內容

浙公網安備 33010602011771號