v2panda的技术专题

iOS开发Tips

2015-07-27  本文已影响239人  大慈大悲大熊猫

介绍

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

小技巧
NSURL *url = ({ 
    NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint]; 
    [NSURL URLWithString:urlString];
});

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

__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
注释

几种常用的注释样式:

@property (nonatomic ,strong) RHBankCard *bankCard;/**<银行卡信息*/
@property (nonatomic ,strong) RHBankCard *bankCard;///<银行卡信息
/**银行卡信息*/
@property (nonatomic ,strong) RHBankCard *bankCard;
typedef enum
{
 ShareTypeSinaWeibo = 1,         /**< 新浪微博 */
 ShareTypeTencentWeibo = 2,      /**< 腾讯微博 */
 ShareTypeDouBan = 5,            /**< 豆瓣社区 */
 ShareTypeQQSpace = 6,           /**< QQ空间 */
}
ShareType;
/**
 *  initWithStyle
 *
 *  @param style           style description
 *  @param reuseIdentifier reuseIdentifier description
 *
 *  @return self
 */
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;

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

正确地定义常量

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

#define ANIMATION_DURATION_SHORT 0.3
#define ANIMATION_DURATION_MIDDLE 0.6
#define ANIMATION_DURATION_LONG 1.0

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

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

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

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

//.h
extern NSString * const PDUserInfoNotification;
//.m
NSString * const PDUserInfoNotification = @"PDUserInfoNotification";

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

CGRect函数

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

应该:

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);

不应该:

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。
应该:

- (void)someMethod { 
  if (![someOther boolValue])
   { 
        return; 
   } 
  //Do something important
}

不应该:

- (void)someMethod {
 if ([someOther boolValue]) 
   { 
    //Do something important
   }
}
持续更新...
上一篇下一篇

猜你喜欢

热点阅读