1.命名规则



(2)变量和对象的命名
给一个对象命名时建议采用修饰+类型的方式.
如果只用修饰命名会引起歧义, 比如title (这个到底是个NSString还是UILabel?). 同样的,
如果只用类型来命名则会缺失作用信息, 比如label (好吧, 我知道你是个UILabel, 但是我不知道它是用来做什么的呀?). So,
正确的命名方式为:titleLabel //表示标题的label, 是UILabel类型
confirmButton //表示确认的button, 是UIButton类型
对于BOOL类型, 应加上is前缀, 比如- (BOOL)isEqualToString:(NSString *)aString
这样会更加清晰. 如果某方法返回非属性的 BOOL 值, 那么应根据其功能, 选用 has 或 is 当前缀, 如- (BOOL)hasPrefix:(NSString *)aString
(3)对于常量的命名最好在前面加上字母k作为标记. 如:
1 | static const NSTimeInterval kAnimationDuration = 0.3; |
定义作为NSDictionary或者Notification等的Key值字符串时加上const关键字, 以防止被修改. 如:
1 | NSString *const UIApplicationDidEnterBackgroundNotification |
Tips:
I. 若常量作用域超出编译单元(实现文件), 需要在类外可见时, 使用extern关键字, 并加上该类名作为前缀. 如 extern NSString *const PGThumbnailSize
II.全局常量(通知或者关键字等)尽量用const来定义. 因为如果使用宏定义, 一来宏可能被重定义. 二来引用不同的文件可能会导致宏的不同. P.S. 对于#define也添加一下前缀k

注意参数过多切有关联的情况

4.建议书写枚举模仿苹果
在列出枚举内容的同时绑定了枚举数据类型NSUInteger,这样带来的好处是增强的类型检查和更好的代码可读性,
枚举类型命名要加相关类名前缀并且枚举值命名要加枚举类型前缀. 示例:
// 不推荐写法
typedef enum{
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0,
UIControlStateDisabled = 1 << 1,
} UIControlState;
// 推荐写法
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0,
UIControlStateDisabled = 1 << 1,
};
5.建议加载xib,xib名称用NSStringFromClass(),避免书写错误
// 推荐写法
[self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([DXRecommendTagVCell class]) bundle:nil] forCellReuseIdentifier:ID];
// 不推荐写法
[self.tableView registerNib:[UINib nibWithNibName:@"DXRecommendTagVCell" bundle:nil] forCellReuseIdentifier:ID];
6. 嵌套判断
推荐写法:
if (!user.UserName) return NO;
if (!user.Password) return NO;
if (!user.Email) return NO;
return YES;
不推荐写法:
BOOL isValid = NO;
if (user.UserName)
{
if (user.Password)
{
if (user.Email) isValid = YES;
}
}
return isValid;
一旦发现某个条件不符合, 立即返回, 条理更清晰
7. 判断nil或者YES/NO
Preferred:
if (someObject) { ... }
if (!someObject) { ... }
Not preferred:
if (someObject == YES) { ...}
if (someObject != nil) { ...}
if (someObject == YES)
容易误写成赋值语句, 自己给自己挖坑了...而且if (someObject)
写法很简洁, 何乐而不为呢?
9.判断if书写方式
建议这样写
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0) return 44;
if (indexPath.row == 1) return 80;
if (indexPath.row == 2) return 50;
return 44;
}
而不是
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0) {
return 44;
}else if (indexPath.row == 1){
return 80;
}else if (indexPath.row == 2){
return 50;
}else{
return 44;
}
}
10.在导航控制中设置标题
或它的子控制器,设置导航栏的标题应该用self.navigationItem.title = @“标题”而不建议self.title = @“标题”;
11.在一个自定义的View中,或者自定义cell中,modal出一个控制器建议:
[UIApplication sharedApplication].keyWindow.rootViewController
代替
self.window.rootViewController,因为程序可能不止一个window,self.window可能不是主窗口;
12.建议:
用CGSizeZero 代替 CGSizeMake(0,0);
CGRectZero代替CGRectMake(0, 0, 0, 0);
CGPointZero代替CGPointMake(0, 0)