美文网首页
iOS小知识杂集(二)

iOS小知识杂集(二)

作者: NN_逝去 | 来源:发表于2018-01-26 11:27 被阅读21次

文章中的内容大多数来源于南峰子的iOS知识小集微博GitHub

  1. 为什么要缓存NSDateFormatter
    Creating a date formatter is not a cheap operation. If you are likely to use a formatter frequently, it is typically more efficient to cache a single instance than to create and dispose of multiple instances. One approach is to use a static variable.网页链接
    采用方案:网页链接
  2. 音量获取: [[AVAudioSession sharedInstance] outputVolume];
  3. 是谁调了我的底层库
    调试的时候,往往底层库会埋一些 NSLog 来调试,使用下面这种方式打印出来的函数名称 __PRETTY_FUNCTION__ 是底层库的函数名。
#define LEFLog(fmt, ...) NSLog((@"%s (%d) => " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

打印是这样的:+[Network post] 中打印了 I am a log,而不清楚是谁调用了。
+[Network post] (22) => I am a log
但是,我想要的是我在最顶层调用时的函数名,这样我可以很容易的看到是那个方法调用了底层库。
不太理解?举个例子吧: 每个APP都会有一个网络层,业务层会直接与网络层进行交互。调试的时候,我想知道 A 请求是在哪个页面中的哪个函数被调用了,咋么办?前提是 NSLog 在底层库。我们可以这样实现:

@implementation LEFLog
+ (NSString *)lastCallMethod
{
    NSArray *symbols = [NSThread callStackSymbols];
    NSInteger maxCount = symbols.count;
    NSString *secondSymbol = maxCount > 2 ? symbols[2] : (maxCount > 1 ? symbols[1] : [symbols firstObject]);
    if (secondSymbol.length == 0) {
        return @"";
    }
    
    NSString *pattern = @"[+-]\\[.{0,}\\]";
    NSError *error;
    NSRegularExpression *express = [NSRegularExpression regularExpressionWithPattern:pattern options:kNilOptions error:&error];
    if (error) {
        NSLog(@"Error: %@", error);
        return @"";
    }
    
    NSTextCheckingResult *checkResult = [[express matchesInString:secondSymbol options:NSMatchingReportCompletion range:NSMakeRange(0, secondSymbol.length)] lastObject];
    NSString *findStr = [secondSymbol substringWithRange:checkResult.range];
    return findStr ?: @"";
}

@end

然后定义一个宏:

#define LEFLog(fmt, ...) NSLog((@"%@, %s (%d) => " fmt), [LEFLog lastCallMethod], __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ 

打印结果是这样的:在 LefexViewController 中的 viewDidLoad 调用了 Networkpost 方法,并打印 I am a log.

-[LefexViewController viewDidLoad], +[Network post] (22) => I am a log
  1. Cocoapodspod installpod update区别
    install 命令不仅在初始时使用,在新增或删除 repo 时也需要运行。update 仅仅在只需更新某一个 repo 或所有时才使用。每次执行 install 时,会将每个repo的版本信息写入到 podfile.lock,已存在于 podfile.lockrepo 不会被更新只会下载指定版本,不在 podfile.lock 中的 repo 将会搜索与 podfile 里面对应 repo 匹配的版本。即使某个 repo 指定了版本,如 pod 'A', '1.0.0',最好也是不要使用 update,因为 repo A 可能有依赖,如果此时使用 update 会更新其依赖。
    5.static方法与class方法的区别
    class修饰的类方法可以被子类重写
    static修饰的类方法不能被子类重写
    6.attribute((objc_requires_super)) 要求子类调用父类方法
    7.CGRectInset它是以rect为中心,根据dx,dy的值来扩大或者缩小,负值为扩大,正值为缩小
    CGRectOffset,它是以rect左上角为基点,向X轴和Y轴偏移dxdy像素

相关文章

  • iOS小知识杂集(二)

    文章中的内容大多数来源于南峰子的iOS知识小集微博或GitHub 为什么要缓存NSDateFormatterCre...

  • iOS 小知识杂集(一)

    一. exclusiveTouch exclusive 独有的;排外的;专一的 其源自UIView,字面意思其具...

  • iOS 基础读书杂集(二)

    没有废话直接来,传送门: iOS 基础读书杂集(一) NO.11 处理KVC:setValue赋值时,给属性赋值n...

  • 小杂集

    今天阴阴郁郁的天,小雨下了半天又停了半天。心情从平平静静到起起落落,听见你的名字,脸就涨红起来半天也褪不去。...

  • iOS总结小知识(二)

    1、UITextView中打开或禁用复制、剪切、选择、全选等功能://继承UITextView重写这个方法 2、为...

  • iOS小知识(二):reverseObjectEnumerato

    举例: 打印结果如下: 参考文章:https://www.jianshu.com/p/5fe6d1b4d4b2

  • iOS 小知识2

    iOS 小知识2 隐藏导航栏的正确姿势 方法一 方法二(契合左滑返回手势) iOS 生成PDF 生成PDF文件步骤...

  • iOS 常见知识点(一):Runtime

    iOS 常见知识点(二):RunLoop iOS 常见知识点(三):Lock Runtime Runtime 是一...

  • iOS 常用到的知识点(一)

    iOS 常用到的知识点(一)iOS 常用到的知识点(二)iOS 常用到的知识点(三) 1. CGRectGetM...

  • iOS 常用到的知识点(三)

    iOS 常用到的知识点(一)iOS 常用到的知识点(二)iOS 常用到的知识点(三) 1. navigationB...

网友评论

      本文标题:iOS小知识杂集(二)

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