美文网首页
开发中的一些Tips

开发中的一些Tips

作者: 董二千 | 来源:发表于2016-04-14 11:02 被阅读56次

    1

    下面是两个图片Url的字符串,都是可以在浏览器上面正常查看的
    http:///kefu-prod-avatar.img-cn-hangzhou.aliyuncs.com/avatar/11516/d23c8a30-f43d-4d71-8b20-ac3d8b5e4600@65-250-668-668a|300h_300w|.png

    http://image.mishi.cn/item/2015/1210/0_6aeaca9f-e1da-478b-8152-4c9f5476c15e.jpg@710h_710w_0e_1l%7C710x534-5rc
    但是用
    NSURL *url = [NSURL URLWithString:aUrlString]
    进行解析时,第一个为nil,第二个是OK的
    原因:第一个含有特殊字符,所以解析不出来
    解决办法:把第一个string转化成UTF-8编码
    [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

    2 NSNull

    官方解释
    The NSNull class defines a singleton object used to represent null values in collection objects (which don’t allow nil values).
    首先它是单例对象,在集合对象中代表空值(条件:集合中的对象不允许用nil来代替空值,就用它)
    它只有一个方法[NSNull null]返回单例对象

    3 NSArray<MSProvince *> *provincesArray

    明确数组里面元素的类型

    4 nonnull & nullable

    在申明属性或者变量时可以用它们来控制是否可以为null
    (变量用__nonnull __nullable)
    简写:
    NS_ASSUME_NONNULL_BEGIN
    NS_ASSUME_NONNULL_END

    5 __kindof 泛型

    <pre>
    @property (nonatomic, readonly, copy) NSArray<__kindof UIView *> *subviews;
    UIButton *button = view.subviews.lastObject;//这里不需要强制类型转换了
    </pre>

    NSArray<NSString *> *strings = @[@"sun", @"yuan"];
    NSDictionary<NSString *, NSNumber *> *mapping = @{@"a": @1, @"b": @2};
    

    6 获取私有属性的两种方法

    • KVC
      <pre>
      ADView *aView = [[ADView alloc]initWithFrame:CGRectZero];
      NSString *str = [aView valueForKey:@"_privateProperty"];
      </pre>

    • Runtime
      <pre>
      NSString *runStr = [[NSString alloc] init];
      Ivar ivar = class_getInstanceVariable([ADView class],[@"_privateProperty" UTF8String]);
      runStr = object_getIvar(aView, ivar);
      </pre>

    7 synthesize和dynamic

    • @synthesize实际的意义就是 自动生成属性的setter和getter方法。
    • @dynamic 就是要告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManagerObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,core data 框架会在程序运行的时候为此类属性生成getter和setter方法。

    8 输出方法名称

    NSLog(@"%s", __PRETTY_FUNCTION__);
    

    9 在32bit和64bit上 int,long,float ,double类型所占的位数是不同的

    size_t s1 = sizeof(int);
    size_t s2 = sizeof(long);
    size_t s3 = sizeof(float);
    size_t s4 = sizeof(double);
    

    32-bit下:4, 4, 4, 8;64-bit下:4, 8, 4, 8。
    (PS: 这个结果随编译器,换其他平台可不一定)

    10 通过app.dSYM文件查找online bug

    xiamindeMacBook-Pro:DWARF xiamin$ atos -arch arm64 -o MishiOS 0x10030fb18

    variable arm64 和处理器是64bit还是32bit有关

    11 通过nib文件获取view

    [[[NSBundlemainBundle]loadNibNamed:@"ADTableViewCell" owner:nil options:nil] lastObject]

    12 像素相关

    1pixel,如果在RGBA8888上是32bit,4Byte,在RGB888上是24bit,3Byte,在RGB565上是16bit,2Byte。

    13

    #define Mask8(x) ( (x) & 0xFF )
    #define R(x) ( Mask8(x) )
    #define G(x) ( Mask8(x >> 8 ) )
    #define B(x) ( Mask8(x >> 16) )
    #define A(x) ( Mask8(x >> 24) )
    #define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )
    

    #define Mask8(x) ( (x) & 0xFF )
    x和16进制0xFF转换,只取最后8位

          00000000 00000000 00000000 11111111
    &     10101010 10101010 10101010 10101010
    _______________________________________________
          00000000 00000000 00000000 10101010
    

    tip
    32位图片16进制展示:
    11111111 11111111 11111111 1111111

    #define G(x) ( Mask8(x >> 8 ) )
    右移8位,相当于去掉末8位,结果
    00000000 10101010 10101010 10101010

          00000000 00000000 00000000 11111111
    &     00000000 10101010 10101010 10101010
    _______________________________________________
          00000000 00000000 00000000 10101010
    

    #define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )
    左移8位,相当于末位加8个0

         00000000 00000000 00000000 10101010
    |    00000000 00000000 10101010 00000000
    |    00000000 10101010 00000000 00000000
    |    10101010 00000000 00000000 00000000
    ______________________________________________
         10101010 10101010 10101010 10101010
    
    

    14 替代Format字符串

    适配64-bit时,你是否遇到了下面的恶心写法:

    NSArray *items = @[@1, @2, @3];
    NSLog(@"数组元素个数:%lu", (unsigned long)items.count);
    

    一般情况下,利用NSNumber的@语法糖就可以解决:

    NSArray *items = @[@1, @2, @3];
    NSLog(@"数组元素个数:%@", @(items.count));
    

    同理,int转string也可以:

    NSInteger i = 10086;
    NSString *string = @(i).stringValue;
    

    当然,如需要%.2f这种Format就不适用了。

    15 NSProxy

    除了重载消息转发机制外没有别的用法

    16 Designated intializer 指定初始化方法

    苹果默认的designated method的宏

    define NS_DESIGNATED_INITIALIZER attribute((objc_designated_initializer))

    1.子类的designated intializer必须调用父类的designated intializer
    2.子类必须覆盖父类所有的designated intializer
    3.如果是非designated intializer,该类有designated intializer,那么要调用该类的designated intializer或者非designated intializer,但是不能调用父类的任何designated intializer

    17

    $(SRCROOT)
    代表的是项目根目录下
    $(PROJECT_DIR)
    代表的是整个项目

    18

     CGSize size = [badgeView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    

    该方法可以在view未add到super view的情况下计算出layout布局的高度

    相关文章

      网友评论

          本文标题:开发中的一些Tips

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