iOS 知识点归纳- 持续更新
来源:互联网 发布:.erm如何生成数据库表 编辑:程序博客网 时间:2024/05/20 03:42
以下的知识点都是我平时的积累 不足之处请多指教
1. 由于证书的原因,安装在手机上的iOS Demo app 运行几天后就无法打开。
2. typedef returnType (^name)(arguments);
typedef void (^btnClickedHandler)(UIButton *sender);
3. #define NS_CLASS_AVAILABLE_IOS(_ios)
NS_CLASS_AVAILABLE_IOS(8.0)// 描述此方法系统8.0以上可用
例子
- (void)showAlertWithTitle:(nullable NSString *)title message:(nullable NSString *)message appearanceProcess:(nullable JXTAlertAppearanceProcess)appearanceProcess actionBlock:(nullable JXTAlertActionBlock)actionBlock NS_CLASS_AVAILABLE_IOS(8.0);
4.宏定义:NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END
如果需要每个属性或每个方法都去指定nonnull和nullable,是一件非常繁琐的事。
苹果为了减轻我们的工作量,专门提供了两个宏:NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END。
在这两个宏之间的代码,所有简单指针对象都被假定为nonnull,因此我们只需要去指定那些nullable的指针。
如下代码所示:
NS_ASSUME_NONNULL_BEGIN@interface TestNullabilityClass ()@property (nonatomic, copy) NSArray * items;- (id)itemWithName:(nullable NSString *)name;@endNS_ASSUME_NONNULL_END
在上面的代码中:
items属性默认是nonnull的
itemWithName:方法的返回值也是nonnull,而参数是指定为nullable的
不过,为了安全起见,苹果还制定了几条规则:
1.typedef定义的类型的nullability特性通常依赖于上下文,即使是在Audited Regions中,也不能假定它为nonnull。
2.复杂的指针类型(如id *)必须显示去指定是nonnull还是nullable。例如,指定一个指向nullable对象的nonnull指针,可以使用”__nullable id * __nonnull”。
3.我们经常使用的NSError **通常是被假定为一个指向nullable NSError对象的nullable指针。
5.把 "www.zhidao.baidu.com" 这样的字符串改成 "com/baidu/zhidao/www"
NSArray 逆序reverseObjectEnumerator
NSString *string = @"www.zhidao.baidu.com"; NSArray *array = [string componentsSeparatedByString:@"."]; NSArray *resultArray = [[array reverseObjectEnumerator] allObjects]; NSString *resultString = [resultArray componentsJoinedByString:@"/"]; NSLog(@"result:%@", resultString);
NSEnumerator 遍历
NSLog(@"------- 枚举器法---------"); // ObjectEnumerator 正序 // reverseObjectEnumerator 逆序 NSEnumerator *enumerator = [array reverseObjectEnumerator]; id obj = nil; // 不确定数组里面具体对象的类型,所以定义成id 类型指针 while (obj = [enumerator nextObject]) { // 通过枚举器,取数组里面的每一个元素 NSLog(@"%@", obj); // 将元素赋给 obj, 直到数组结束 //取到的结果为nil,退出while }
打印结果:
6.__func__ 当前函数名
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // __func__ 当前函数名 NSLog(@"%@ == %s", NSStringFromClass([self class]), __func__);}
打印:
7.页面A to 页面B , 页面A的viewDidDisappear方法和 页面B的viewDidAppear方法哪个先调用?
分两种情况 push 和 present
A和B分别添加如下代码:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSLog(@"%@ == %s", NSStringFromClass([self class]), __func__);}- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSLog(@"%@ == %s", NSStringFromClass([self class]), __func__);}- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; NSLog(@"%@ == %s", NSStringFromClass([self class]), __func__);}- (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; NSLog(@"%@ == %s", NSStringFromClass([self class]), __func__);}
A push B:
A present B:
结果并不相同哦~
ApushB,先执行A的viewDidDisappear 后执行B的viewDidAppear;
ApresentB, 先执行B的viewDidAppear后执行A的viewDidDisappear;
8.使用GCD实现需求:A、B、C 三个任务并发,完成后执行任务D
typedef void(^demoBlock)(NSString *str);- (void)demoBlock:(demoBlock)block { block(@"finish");}
1.
// A. // 创建一个队列 // 参数1:队列名(C语言写法) // 参数2:队列类型(串行/并行) // DISPATCH_QUEUE_SERIAL 串行 // DISPATCH_QUEUE_CONCURRENT 并行 dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); // 创建一个调度组 dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ NSLog(@"===A==="); }); dispatch_group_async(group, queue, ^{ NSLog(@"===B==="); }); dispatch_group_async(group, queue, ^{ NSLog(@"===C==="); }); dispatch_group_notify(group, queue, ^{ NSLog(@"===D finfished==="); });
打印
2.
// B. dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); [self demoBlock:^(NSString *str) { NSLog(@"===A==="); dispatch_group_leave(group); }]; dispatch_group_enter(group); [self demoBlock:^(NSString *str) { NSLog(@"===B==="); dispatch_group_leave(group); }]; dispatch_group_enter(group); [self demoBlock:^(NSString *str) { NSLog(@"===C==="); dispatch_group_leave(group); }]; // 获取主队列 dispatch_queue_t mainQueue = dispatch_get_main_queue(); dispatch_group_notify(group, mainQueue, ^{ NSLog(@"===D finished"); });
打印:
3.应用信号量
// C. // 获取全局队列 // 参数1:选择的是哪个优先级的全局队列 // 参数2:暂时没用,只能填0 dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, globalQueue, ^{ dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [self demoBlock:^(NSString *str) { NSLog(@"===A==="); dispatch_semaphore_signal(semaphore); }]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); dispatch_group_async(group, globalQueue, ^{ dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [self demoBlock:^(NSString *str) { NSLog(@"===B==="); dispatch_semaphore_signal(semaphore); }]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); dispatch_group_async(group, globalQueue, ^{ dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [self demoBlock:^(NSString *str) { NSLog(@"===C==="); dispatch_semaphore_signal(semaphore); }]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); dispatch_group_notify(group, globalQueue, ^{ NSLog(@"===D finished==="); });打印:
- iOS 知识点归纳- 持续更新
- Java知识点归纳(持续更新)
- ACM小知识点归纳(持续更新)
- iOS知识点小集一行代码(持续更新......)
- iOS开发知识点总结【持续更新】
- IOS--零碎知识点(持续更新 ing...)
- Ios-视频直播-知识点汇总-持续更新
- Matplotlib简要归纳~持续更新
- 2017年计算机软考(软件设计师)知识点归纳(持续更新中。。。)
- 知识点积累~持续更新
- IOS学习中的一些小知识点总结(持续更新)
- iOS开发实用知识点记录(持续更新)
- iOS--小知识点(持续更新)
- iOS开发已已错已忘知识点总结,持续更新中,,,
- iOS 面试题归纳整理—基础篇(持续更新中)
- iOS 面试题归纳整理—进阶篇(持续更新中)
- 加解密归纳汇总(持续更新)
- Python NumPy入门归纳~持续更新
- 音视频数据处理(14)--- H264之宏块、片组、片
- 一个简单的viewpager适配器
- PHP 静态方法、静态属性
- Threding
- shiro第二天 shiro授权 shiro和企业项目整合开发
- iOS 知识点归纳- 持续更新
- hdoj1028 Ignatius and the Princess III(母函数,生成函数)
- 学术论文你该怎么写
- POJ 1375 Intervals 笔记
- HDU
- java开发者的福音, 功能齐全的Integer类
- 我有问题-Qt篇(1)
- android_apktool工具的使用
- android Retrofit简单使用及源码分析