开发中的一些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<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布局的高度