当前位置: 首页>编程语言>正文

iOS 开发小贴士

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

  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中添加

https://www.xamrdz.com/lan/59g2016600.html

相关文章: