• 主页
  • 关于我
    • DSL'Blog photo

      DSL'Blog

      我叫董诗磊,我就是一码农.欢迎来到我的博客

    • 了解更多
    • Email
    • Github
  • 文章
    • 所有文章
    • 所有标签

2017-04-24 iOS小知识小记

24 Apr 2017

Reading time ~1 minute

NSNotification

1.iOS8及以前,NSNotificationCenter持有的是观察者的unsafe_unretained指针(可能是为了兼容老版本),这样,在观察者回收的时候未removeOberser,而后再进行post操作,则会向一段被回收的区域发送消息,所以出现野指针crash。而iOS9以后,unsafe_unretained改成了weak指针,即使dealloc的时候未removeOberser,再进行post操作,则会向nil发送消息,所以没有任何问题。

2.postNotification:总是会卡住当前线程,待observer执行(如不特殊处理selector也会在postNotification:所在线程执行)结束之后才会继续往下执行。所以是同步的。

3.postNotification:必须是在主线程。所以不是在主线程的时候,有两种方式可以解决。这里用的是block的方式


[[NSNotificationCenter defaultCenter] addObserverForName:@"dsl" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        NSLog(@"current thread %@ 刷新UI", [NSThread currentThread]);
        // 刷新UI ...
    }];

苹果文档

iOS枚举

1.NS_OPTIONS

typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
    UISwipeGestureRecognizerDirectionNone = 0,  //值为0
    UISwipeGestureRecognizerDirectionRight = 1 << 0,  //值为2的0次方
    UISwipeGestureRecognizerDirectionLeft = 1 << 1,  //值为2的1次方
    UISwipeGestureRecognizerDirectionUp = 1 << 2,  //值为2的2次方
    UISwipeGestureRecognizerDirectionDown = 1 << 3  //值为2的3次方
};

形式typedef NS_OPTIONS(NSUInteger,opttions ) {

}官方推荐的。NSUInteger这个枚举值是固定的,opttions这个是枚举类型。可以自定义的。

2.NS_ENUM

typedef NS_ENUM(NSInteger, NSWritingDirection) {
    NSWritingDirectionNatural = -1,  //值为-1    
    NSWritingDirectionLeftToRight = 0,  //值为0
    NSWritingDirectionRightToLeft = 1  //值为1       
};

形式typedef NS_ENUM(NSInteger,opttions ) {

}官方推荐的。NSInteger这个枚举值是固定的,opttions这个是枚举类型。可以自定义的。

3.总结两者的不同:(1).枚举值是不一样的一个是NSUInteger,一个是NSInteger (2).如果在一个需要枚举值的地方需要多个枚举值,那么就需要用NS_OPTIONS,比如:

JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;

否则就要用NS_ENUM 只能存在一个枚举值。换句话说就是多选就是options(options本来就有选择的意思),要是单选的就用ENUM。没了。

NSInteger 和 NSUInteger

NSInteger 是根据系统的位数来判断的是32位就是int,64是long,

NSUInteger 是一个非零的整数

weak和assign有什么区别?

1.week主要是修饰对象类型,是弱引用比如修饰delegate,对象释放之后就会被置nil 2.assig是修饰基本的数据类型。

iOS推送和JPush

1.iOS推送

  • 1.APP向苹果服务器获取token
  • 2.苹果服务器把token发送给APP
  • 3.APP再把token发送自己的服务器
  • 4.APPServer把推送的消息和token一起发送给苹果的服务器
  • 5.苹果的服务器在消息推送给APP
  • 流程就是这个样子的

2.JPush 这个图片是我根据极光推送文档中找的,这里就是总结一下。加深对极光推送的理解。

  • 1.这条线路走的是苹果的服务器,有JPush推送给苹果的服务器,再有苹果的服务器推送给APP
  • 2.这条线路走的是应用内消息,这个其实就是长链接。当APP启动的时候,APP中的JPushSDK与与JPush服务器保持长链接,然后直接推送给APP

  • JPushSDK
  • 「转载」《微言(官方版)》iOS源码分享–极光推送实践篇 - 分享 - 极光社区
  • 详解极光推送的 4 种消息形式—— iOS 篇 - 分享 - 极光社区

SDK和API

  • API是一种应用程序与操作系统交互操作的接口规范。
  • SDK是应用程序的一种开发包,当然里面会将API进行封装,以方便应用程序的开发。

SQL中常用的语句

  • 1.检查是否存在某条数据(这个问题曾经苦恼我了很久,现在我解决了)
  • 解决方法:
     NSInteger count = [db intForQuery:@"SELECT COUNT(*) FROM DSLCY WHERE name = ?",deptId];
    
  • 2.去除重复的内容
    delete from DSL_ZI where id not in (select min(id) from DSL_ZI group by name )
    
  • 3.sql把一个表某字段复制到另一个表
update zi SET logogriph = (select mimian from zimi where zi.name = zimi.name)

iOS视图控制器的生命周期

  • 1.loadView 检测xib文件,如果没有相应的xib文件就直接返回一个空的view
  • 2.viewDidLoad loadView执行之后在执行viewDidLoad,而且这个方法只是执行一次,以后不会在执行。还有就是加载子控件。
  • 4.viewWillAppear 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
  • 5.viewDidAppear 视图已在屏幕上渲染完成
  • 6.viewillDisaAppear 视图将要消失
  • 7.viewDidDisAppear 视图已经消失
  • 8.viewDidUnload 该方法已经被抛弃不作解释
  • 9.delloc 释放对象
  • 10.didReceiveMemoryWarning 内存不够用的时候这个方法会释放一些不用的视图对象