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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容