美文网首页
iOS 开发小贴士

iOS 开发小贴士

作者: demoker | 来源:发表于2016-05-10 14:29 被阅读1934次

    开发过程中或多或少会碰见一些问题和纪要,感觉有必要记下来,避免下次再犯,此文章后续会更新...

    1. iOS app通过itunes共享文件
      在程序的配置文件中添加Application supports iTunes file sharing,设置为YES;这里共享的是沙河的Document目录

    2. DZNEmptyDataSet使用心得
      同mj刷新一起使用的时候,一定要先endrefresh方法,然后再去刷新tableview,因为DZNEmptyDataSet是在reload数据的时候获取tableview的偏移和bounds,然后去设置空视图的位置的,如果先reload,则会导致空视图空视图显示出来的时候往上偏了54像素,54从哪里冒出来的呢?全局搜了一下,发现mj刷新正在pulling的时候正好54。

    3. 个人认为开发中涉及到系统权限的应该统一放在一起,放在一个文件中。

    4. CocoaLumberjack 自定义logger输出样式

      1. 首先自定义一个类似DDLogFileFormatterDefault的formatter作为格式输出,实例化一个fomatter;
      2. 自定义一个ddloger,继承于DDAbstractDatabaseLogger,重载db_log、db_save,添加post服务器方法;将第一步创建的formatter赋值给ddloger的formatter属性;
      3. nslog打印

      注意:
      DDLog:基础类,必须引入的。
      DDASLLogger:支持将调试语句写入到苹果的日志中。一般正对Mac开发。可选。
      DDTTYLogger:支持将调试语句写入xCode控制台。我们即使要用它。可选。
      DDFileLogger:支持将调试语句写入到文件系统。可选。
      DDLog的输出级别默认提供以下若干种:
      DDLogError:定义输出错误文本
      DDLogWarn:定义输出警告文本
      DDLogInfo:定义输出信息文本
      DDLogDebug:定义输出调试文本
      DDLogVerbose:定义输出详细文本

      提供的日志级别为:
      LOG_LEVEL_ERROR:只显示错误日志。
      LOG_LEVEL_WARN:包括:LOG_LEVEL_ERROR
      LOG_LEVEL_INFO:包括:LOG_LEVEL_WARN
      LOG_LEVEL_DEBUG:包括:LOG_LEVEL_INFO
      LOG_LEVEL_VERBOSE:包括:LOG_LEVEL_DEBUG
      LOG_LEVEL_OFF:关闭日志
      level = LOG_LEVEL_VERBOSE的时候,以上所有的level的打印日志都会进行打印,在appdelegate中添加多少个logger,就会形成几种情况的日志,譬如:文件、数据库、控制台等,添加自定义的之后便会增加一种日志形式(自定义的上传给服务器的日志)
      问题:

      1. 日志文件logger只会存入error和warning的日志吗?
      2. 日志文件只有一个吗?如果不是,什么时候就会创建?
    5. category中添加成员变量
      .h

      @property (nonatomic, retain)   LBEmptyPageView * emptyView;
      @property (assign, nonatomic) BOOL  showNetError;
      
      static const void * emptyViewKey =  &emptyViewKey;
      
      @implementation BaseViewController  (EmptyDataSet)
      - (LBEmptyPageView *)emptyView {
      return objc_getAssociatedObject(self,   &emptyViewKey);
      }
      
      - (void)setEmptyView:(LBEmptyPageView *)emptyView {
        objc_setAssociatedObject(self,    emptyViewKey, emptyView,    OBJC_ASSOCIATION_RETAIN_NONATOMIC);
      }
      
      - (BOOL)showNetError{
         return   [objc_getAssociatedObject(self, _cmd)   boolValue];
      }
      
      - (void)setShowNetError:    (BOOL)showNetError{
      objc_setAssociatedObject(self, @selector(showNetError), @(showNetError), OBJC_ASSOCIATION_ASSIGN);
      }
      

      category使用原则:

      1. category的实现可以依赖主类,但主类一定不依赖category,也就是移除一个category的代码不会对主类产生影响
      2. category可以直接食用主类已有的私有成员变量,但不应该为实现catecory而在主类中添加成员变量,考虑通过上述的方式实现。
    6. 在用xib自定义tableview的头部时候,有时会出现当我NSbundle实例化之后改变它的frame不管用,这个可能xcode的bug或者是缓存问题,删掉重新搞

    7. 之前碰到一个问题就是缺少库的问题,第一次显示缺AFNetWorking,我将AFNetWorking从cocoapods中删除手动添加之后,它又会报其它库的错误,一般这种问题就是因为路径的问题,这里奉上解决方法:library search path 设置:$(inherited)

    8. iOS7报错信息:Library not loaded: /System/Library/Frameworks/Photos.framework/Photos
      Referenced from: /var/mobile/Applications/E19A46C1-C0EC-4DC3-A9CE-DC84811DD7E8/xxxx.app
      Reason: image not found
      解决方案:You need to weak link Photos.framework, not ALAssetsLibrary! Xcode -> Targets -> YourTargetName -> Build Phases -> Link Binary With Libraries -> Set Photos.framework to Optional.

    9. 图片裁剪:可以实现美食杰启动页图片上下分开动画效果

    CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0, image.size.height *0.5, image.size.width, image.size.height *0.5))
    
    1. 播放GIF比较好的库:FlipBoard出品的FLAnimatedImage

    2. time profilter部分专词意思
      Separate by Thread:按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。
      Invert Call Tree:反向输出调用树。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。
      Hide Missing Symbols:隐藏缺失符号。如果 dSYM 文件或其他系统架构缺失,列表中会出现很多奇怪的十六进制的数值,用此选项把这些干扰元素屏蔽掉,让列表回归清爽。
      Hide System Libraries:隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。
      Flattern Recursion:拼合递归。将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条。
      Top Functions:找到最耗时的函数或方法。

    3. NSSortDescriptor
      通过它可以实现数组内模型根据某一个字段或者多个进行排序,示例代码如下:

    //按年龄和名字排序,如果碰到年龄相等的,则根据名字排序
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"_age" ascending:NO];
    NSSortDescriptor *sortDescriptorName = [[NSSortDescriptor alloc] initWithKey:@"_name" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, sortDescriptorName, nil];
    [_mutArrVideo sortUsingDescriptors:sortDescriptors];
    ```

    1. 获取数字数组中的最大项和最小项

    NSArray * arr = [NSArray arrayWithObjects:@"10",@"50",@"9", nil];
    NSInteger max = [[arr valueForKeyPath:@"@max.intValue"] integerValue];
    ```

    1. 非主线程执行UI操作检测工具
      PSPDFUIKitMainThreadGuard.m

    2. 奇怪矩阵
      控制台打印:

      <Error>: CGAffineTransformInvert: singular matrix.
      May 11 16:19:48  LBAssistant[4704] <Error>:     CGAffineTransformInvert: singular matrix.
      May 11 16:19:48  LBAssistant[4704] <Error>:     CGAffineTransformInvert: singular matrix.
      

      并且相机黑屏,但是拍到的照片是存在的,只是黑屏,
      bug猜测原因是:UIActionsheet的问题,更换自定义的就没事儿了,但心里还是觉得此问题不简单,另有他因,还待高人指点。

    3. cell计算高度卡顿
      xib布局的自定义cell第一次计算高度卡顿2s,其原因是:布局中lable使用了第三方字体(黑体),非系统字体

    4. brew update 出错:Error: /usr/local must be writable!​ 解决方案:

      sudo chgrp -R admin /usr/local
      sudo chmod -R g+w /usr/local
      
    5. 关于写入权限的问题

      sudo chown demoker /Library/Caches/Homebrew
      

      demoker 是你当前用户名,后面的是你受权限限制的文件目录

    6. 关于injectionforXcode 使用时碰到的问题

      1. 真机运行
        解决方法:在main.m或者.pch中添加👇代码:
        #ifdef DEBUG
            static char _inMainFilePath[] = __FILE__;
            static const char *_inIPAddresses[] = {"192.168.83.47", "127.0.0.1", 0};
            //👆两个声明可加可不加
            #define INJECTION_ENABLED
            #import "/tmp/injectionforxcode/BundleInjection.h"
        #endif
        
      2. Could not codesign as 'iPhone Developer':/Users/...
      tip_19.png
      issue图片中写得很清楚了证书到底是图中两个证书里面的哪一个,解 决方法就是修改iOSInjectionProject/x86_64/identity.txt 文件中证书为正 确的那一个即可,这样就可以使用这个插件了😄。[参考] (https://github.com/johnno1962/injectionforxcode/issues/41)
    7. synx 同步iOS工程目录
      Xcode下面直接创建Group时在本地项目文件夹中并不会形成实体文 件夹,通过synx可以将Group目录同步。使用:

      1. 安装
        sudo gem install synx
      2. 使用
        synx your path

    CocoaPods管理的库要重新pod install一次,手动添加的Framework也要重新添加。

    1. Realm pod install 失败

    [!] /bin/bash -c
    set -e
    sh build.sh cocoapods-setup

    core is not a symlink. Deleting...
    Downloading dependency: core 1.0.1
    Downloading core failed:
    curl: (56) SSLRead() return error -36
    ```
    解决方法:
    ```rm -rf Pods```,删除工程目录下的pods文件夹,然后重新   pod install,安装Realm的时候会慢一些,等了很长时间...解决方     法  参考链接[🔗](https://github.com/realm/realm-cocoa/   issues/2713)
        
    ```
    curl https://static.realm.io/downloads/core/realm-core-1.0.1.tar.bz2 -O
    mkdir $TMPDIR/core_bin
    mv realm-core-1.0.1.tar.bz2 $TMPDIR/core_bin
    
    22. 子类是可以调用父类xib文件进行实例化的,例如LBWebViewController
    23. sublime 插件安装方法:[链接](https://packagecontrol.io/installation#st3)
          1. 
    ```ctrl+ `
    ```,打开console,执行
    ```simple
    ```中的命令,即可
          2. 安装完
    ```package control.sublime-package
    ```,就可以安装其他插件了
          3. 
    ```shift+command+p
    ``` 找到
    ```install package
    ```命令,回车,然后输入需要安装的插件名称,再回车就可以了
    24. realm pod 报错'object_schema.hpp' file not found 
         
        ```
        1. rm -rf Pods
        2. rm -rf ~/Library/Caches/CocoaPods
        ```
    
    
    Done.

    相关文章

      网友评论

          本文标题:iOS 开发小贴士

          本文链接:https://www.haomeiwen.com/subject/geryrttx.html