开发Tips收集-2017年07月

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • 点击通知栏的通知进入程序时,会触发App Delegate里的方法,分为以下两种情况:
    1. 程序未启动(即底部任务栏里没有进程)时:
        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions。对于launchOptions参数,需要经过以下处理:NSDictionary* pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey],其中的pushNotificationKey才是从服务端推送过来的数据,使用键值对方式就可以读取服务器传递过来的额外参数了。
      应用还没有加载,这时如果点击通知的显示按钮,会调用didFinishLaunchingWithOptions,不会调用didReceiveRemoteNotification方法。如果点击通知的关闭按钮,再点击应用,只会调用didFinishLaunchingWithOptions方法。
    2. 程序已启动:如果程序已经启动,并驻留在内存中,不管程序是在前台(Foreground)还是在后台(Background),如果点击通知栏的通知进入程序将触发以下方法:
        - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo,其中的userInfo参数,就已经是服务端推送过来的数据,也是采用键值对方式进行读取。如果点击关闭再点击应用,则上面两个方法都不会被调用这时,只能在applicationWillEnterForeground或者applicationDidBecomeActive,根据发过来通知中的badge进行判断是否有通知,然后发请求获取数据
  • 真机测试时提示Could not find Developer Disk Image.这是由于真机系统过高或者过低,Xcode中没有匹配的配置包文件,我们可以通过这个路径进入配置包的存放目录: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport,将需要的配置包加入到这个文件夹来解决问题。
  • 使用CAShapeLayer画线的优势:
    1. 渲染快,采用硬件加速,比用Core Graphics快很多;
    2. 高效使用内存,由于不需要像普通layer那样创建寄宿图,所以无论改layer多大,都不要占用太多内存;
    3. 超出图层依然可以绘图,不会被图层边界裁剪掉;
    4. 不会出现像素化, CAShapeLayer在做3D变换时,不会像普通有寄宿图的CALayer那样变得像素画.
  • 最常发生的是View的内存泄露问题,首先查看是发生内存泄露的view之间是否有delegate的关系,若有,则去看delegate属性有没有声明weak,一般的由于service或者读取缓存等异步操作引起的内存泄露问题。
  • 用约束做UIView动画
    1. 把需要改的约束Constraint拖条线出来,成为属性
    2. 在需要动画的地方加入代码,改变此属性的constant属性
    3. 开始做UIView动画,动画里边调用layoutIfNeeded方法
  • layoutSubviews方法什么时候调用?
    1. init方法不会调用
    2. addSubview方法等时候会调用
    3. bounds改变的时候调用
    4. scrollView滚动的时候会调用scrollView的layoutSubviews方法(所以不建议在scrollView的layoutSubviews方法中做复杂逻辑)
    5. 旋转设备的时候调用
    6. 子视图被移除的时候调用
  • NSSystemTimeZoneDidChangeNotification监听修改时间界面的两个按钮状态变化UIApplicationSignificantTimeChangeNotification 监听用户改变时间 (只要点击自动设置按钮就会调用) NSSystemClockDidChangeNotification 监听用户修改时间(时间不同才会调用)
  • 开发中如果要动态修改tableView的tableHeaderView或者tableFooterView的高度,需要给tableView重新设置,而不是直接更改高度。正确的做法是重新设置一下tableView.tableFooterView = 更改过高度的view。其实在iOS8以上直接改高度是没有问题的,在iOS8中出现了contentSize不准确的问题。

你看到的是非授权版本!爬虫凶猛,请尊重知识产权!

转载请注明出处:http://conanwhf.github.io/2017/07/12/Tips201707/

访问原文「开发Tips收集-2017年07月」获取最佳阅读体验并参与讨论