介绍

随着开发的进行,用到的一些小技巧和插件工具也越来越多。在这里统一的总结一下,方便查阅,时时更新。

小技巧
  • 一个 GCC 非常模糊的特性,以及 Clang 也有的特性是,代码块如果在闭合的圆括号内的话,会返回最后语句的值。
1
2
3
4
NSURL *url = ({ 
NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint];
[NSURL URLWithString:urlString];
});

这个特性非常适合组织小块的代码,通常是设置一个类。给出一个重要的入口并且减少相关干扰,能让代码聚焦于关键的变量和函数中。此外,这个方法有一个优点,所有的变量都在代码块中,也就是只在代码块的区域中有效,这意味着可以减少对其他作用域的命名污染。

  • 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。

    如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。

1
2
3
4
5
6
7
8
9
10
__weak __typeof__(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
__strong __typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doSomething];
[strongSelf doSomethingElse];
} else {
// Probably nothing... return;
}
});

在 doSomething 中,weakSelf 不会变成 nil,不过在 doSomething 执行完成,调用第二个方法 doOtherThing 的时候,weakSelf 有可能被释放。即在没有循环引用的时候,block 是否被 retain 或者是一个属性都没关系。如果 block 被传递或者 copy 了,在执行的时候,weakSelf 可能会变成 nil。于是,strongSelf 就派上用场了,而__strong确保在 Block 内,strongSelf 不会被释放。

Xcode插件

1.ColorSense for Xcode - 用UIColor或者 NSColor的方法会弹出色盘和颜色角标,赞!

2.Peckham - 能十分方便的在代码中引入头文件,支持模糊搜索,快捷键control+command+p。

3.SCXcodeMinimap - 可以再代码侧面添加一个小地图,方便搜索的时候快速定位,快捷键control+shift+m。

4.XToDo - 快速添加todo list(view ->snippets),且能精确查找todo,快捷键control+t。

5.VVDocumenter - 快速注释,快捷键///。

6.KSImageNamed - 自动在 imageNamed:方法后面列出项目里所有的文件名,带缩略图。

7.HOStringSense - 格式化字符串,方便好用。

8.FuzzyAutocompletePlugin - 方法名模糊匹配,提高效率的好工具。

9.ClangFormat-Xcode - 一键格式化代码。

几种处理JSON的工具or网站

JSON校验

JSON格式化工具

json editor online

图片压缩

tinypng - 无损压缩,高效好用。

调试接口

Postman(chrome插件 - 见图)

Postman

注释

几种常用的注释样式:

1.

1
2
@property (nonatomic ,strong) RHBankCard *bankCard;/**<银行卡信息*/
@property (nonatomic ,strong) RHBankCard *bankCard;///<银行卡信息

2.

1
2
/**银行卡信息*/
@property (nonatomic ,strong) RHBankCard *bankCard;

3.

1
2
3
4
5
6
7
8
typedef enum
{
ShareTypeSinaWeibo = 1,         /**< 新浪微博 */
ShareTypeTencentWeibo = 2,      /**< 腾讯微博 */
ShareTypeDouBan = 5,            /**< 豆瓣社区 */
ShareTypeQQSpace = 6,           /**< QQ空间 */
}
ShareType;

4.

1
2
3
4
5
6
7
8
9
/**
 *  initWithStyle
 *
 *  @param style           style description
 *  @param reuseIdentifier reuseIdentifier description
 *
 *  @return self
 */
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;

前两种注释方式可以自由选择,让代码更美观。第三种是用在enum类型,第四种用的是喵神的VVDocumenter插件,适用于param多的方法。

正确地定义常量

以前定义常量都是用的#define,很简单也方便,从没想过可能出现的问题。一般这么定义:

1
2
3
#define ANIMATION_DURATION_SHORT 0.3
#define ANIMATION_DURATION_MIDDLE 0.6
#define ANIMATION_DURATION_LONG 1.0

这段代码是不是看起来很熟悉,在开发中也会经常用到。那么问题来了,宏定义只是简单地替换,即将一切宏定义替换成定义后面的内容,所以

  • 宏定义不会检查替换的“类型”,只要遇到,就做替换。
  • 宏定义不保证“不可变”,因为可以重复定义,不能保证值不变。

所以,恰当的常量应该具备合适的名字、正确的类型,还有const、extern等关键字的修饰。例:

1
2
//动画时间长度常量 
static const NSTimeInterval kAnimationDurationLong = 1.0f;

首先加static,限定在本文件中使用,确保不与其他的常量冲突,其次加const确保常量不被改变。若要定义一个全局变量,则在.h文件中用extern声明,在.m中定义,这样:

1
2
3
4
//.h
extern NSString * const PDUserInfoNotification;
//.m
NSString * const PDUserInfoNotification = @"PDUserInfoNotification";

关于这点,更详细的可以看这里

CGRect函数

当访问CGRect里的x, y, width, 或 height时,应该使用CGGeometry函数而不是直接通过结构体来访问。引用Apple的CGGeometry:在这个参考文档中所有的函数,接受CGRect结构体作为输入,在计算它们结果时隐式地标准化这些rectangles。因此,你的应用程序应该避免直接访问和修改保存在CGRect数据结构中的数据。相反,使用这些函数来操纵rectangles和获取它们的特性。

应该:

1
2
3
4
5
6
CGRect frame = self.view.frame;
CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
CGRect frame = CGRectMake(0.0, 0.0, width, height);

不应该:

1
2
3
4
5
6
CGRect frame = self.view.frame;
CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;
CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };

黄金路径

当使用条件语句编码时,左手边的代码应该是”golden” 或 “happy”路径。也就是不要嵌套if

语句,多个返回语句也是OK。

应该:

1
2
3
4
5
6
7
- (void)someMethod { 
if (![someOther boolValue])
{
return;
}
//Do something important
}

不应该:

1
2
3
4
5
6
- (void)someMethod {
if ([someOther boolValue])
{
//Do something important
}
}

更多的可以查看iOS-Good-Practices