| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [View Raw Code] [Original HTTPS Page] |
NSArray *array = @[@"12-11", @"12-11", @"12-11", @"12-12", @"12-13", @"12-14"];
1.开辟新的内存空间,然后判断是否存在,若不存在则添加到数组中,得到最终结果的顺序不发生变化。效率分析:时间复杂度为O ( n2 ):
NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:array.count];
// 外层一个循环
for (NSString *item in array) {
// 调用-containsObject:本质也是要循环去判断,因此本质上是双层遍历
// 时间复杂度为O ( n^2 )而不是O (n)
if (![resultArray containsObject:item]) {
[resultArray addObject:item];
}
}
NSLog(@"resultArray: %@", resultArray);
2.利用NSDictionary去重,字典在设置key-value时,若已存在则更新值,若不存在则插入值,然后获取allValues。若不要求有序,则可以采用此种方法。若要求有序,还得进行排序。效率分析:只需要一个循环就可以完成放入字典,若不要求有序,时间复杂度为O(n)。若要求排序,则效率与排序算法有关:
NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] initWithCapacity:array.count];
for (NSString *item in array) {
[resultDict setObject:item forKey:item];
}
NSArray *resultArray = resultDict.allValues;
NSLog(@"%@", resultArray);
如果需要按照原来的升序排序,可以这样:
resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSString *item1 = obj1;
NSString *item2 = obj2;
return [item1 compare:item2 options:NSLiteralSearch];
}];
NSLog(@"%@", resultArray);
3.利用集合NSSet的特性(确定性、无序性、互异性),放入集合就自动去重了。但是它与字典拥有同样的无序性,所得结果顺序不再与原来一样。如果不要求有序,使用此方法与字典的效率应该是差不多的。效率分析:时间复杂度为O (n):
NSSet *set = [NSSet setWithArray:array];
NSArray *resultArray = [set allObjects];
NSLog(@"%@", resultArray);
如果要求有序,那就得排序,比如这里要升序排序:
resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSString *item1 = obj1;
NSString *item2 = obj2;
return [item1 compare:item2 options:NSLiteralSearch];
}];
NSLog(@"%@", resultArray);
4. 有序集合--->直接使用有序集合
NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array];
NSLog(@"%@", set.array);
增:insert into tb_blogs(name, url) values('DragonLi','https://github.com/DevDragonLi');
删: delete from tb_blogs where blogid = 1;
改:update tb_blogs set url = 'www.henishuo.com' where blogid = 1;
查:select name, url from tb_blogs where blogid = 1;
当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决,如果还是不行就会报unrecognized selector异常
objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下:
三次拯救程序崩溃的机会
dispatch_semaphore信号量为基于计数器的一种多线程同步机制。用于解决在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题。
semaphore计数大于等于1,计数-1,返回,程序继续运行。如果计数为0,则等待。
dispatch_semaphore_signal(semaphore)为计数+1操作。
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)为设置等待时间,这里设置的等待时间是一直等待
1. 调度组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"netWorking_Frist");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"netWorking_Second");
});
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"netWorking_Three");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"complete");
});
2. 信号量
- (void)netWorkingimplementation{ // 基于自身项目的网络请求
// 1. 发起请求
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// 2. 成功/失败回调标记
dispatch_semaphore_signal(semaphore);
// 3. 计数为0 ,则一直等待
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
1 .h
- (instancetype)init __attribute__((unavailable("Disabled. Use +sharedInstance instead")));
- (instancetype)init NS_UNAVAILABLE;
2.m
//3. 内部不响应 不建议!
- (instancetype)init {
// 抛出不识别,没有说明真的原因
[super doesNotRecognizeSelector:_cmd];
return nil;
}
// 通过断言
- (instancetype)init1{
NSAssert(false,@"unavailable, use sharedInstance instead");
return nil;
}
// 通过异常
- (instancetype)init2{
[NSException raise:NSGenericException format:@"Disabled. Use +[%@ %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(sharedInstance))];
return nil;
}
| Back | FazBrowse Home | New Git URL |