开发中的一些Tips

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 *provincesArray

明确数组里面元素的类型

4 nonnull & nullable

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

5 __kindof 泛型


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

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

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

  • KVC


    ADView *aView = [[ADView alloc]initWithFrame:CGRectZero];
    NSString *str = [aView valueForKey:@"_privateProperty"];

  • Runtime


    NSString *runStr = [[NSString alloc] init];
    Ivar ivar = class_getInstanceVariable([ADView class],[@"_privateProperty" UTF8String]);
    runStr = object_getIvar(aView, ivar);

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)