欢迎使用CSDN-markdown编辑器

代码规范
iOS代码规范
命名
所有命名必须使用英文单词命名,不要拼错单词。原则上不要出现中文拼音命名,但是不绝对。

正确

NSString *myName = @”Lily”;

错误

NSString *myNome = @”Lily”;
类名
由于Objective-C没有命名空间的设计,所以类名加上公司及项目的前缀,前缀全部大写,类名除前缀外,每个单词的首字母大写。

例如云微店的项目缩写是YWD

正确

YWDUserManager,YWDServiceManager,YWDProductManager

错误

UserManager,ServiceManager,Productmanager
数据模型类型用Entity后缀,而且数据模型尽量不包含业务逻辑。瘦模型。

例如

YWDUserEntity
YWDProductEntity
常量
避免出现magic number(未标识作用的常数),而是用常量代替。而常数的宏定义(不建议用宏,而应该用const进行定义)应与它实际使用时的类型相一致。如以3.0来定义浮点类型,用3表示整型。

常量尽量用const进行定义,少用#define,因为const 会帮你检查类型。k+前缀+描述,使用驼峰法。

例如

static NSString * const kYWDAPIUrl = @”http://www。ywd.com”;

static CGFloat const kYWDRefrashHeight = 50.0;
通知(Notification)的命名,应该是k+前缀+描述+Notification

例如

static NSString * const kYWDUserDidLoginNotification = @”YWDUserDidLoginNotification”;

static NSString * const kYWDUserDidLogoutNotification = @”YWDUserDidLogoutNotification”;

变量
首字母小写,之后每一个新单词的首字母都是大写

变量名必须清晰的表达是变量代表什么

正确

NSString *cityName = @”北京”;

NSString *detailTitle = @”我要卖一个二手车”;

错误

NSString *theT = @”我有一个二手车”
for循环中的游标变量,可以使用单字母的变量。foreach中的变量,可以尽量简单。

for (int i = 0; i < 10; i++) {
NSLog(@”%d”,i);
}
对于简单的数据类型,比如NSString,NSNumber,BOOL,不建议加类型后缀。BOOL要加is前缀。但是,NSDictory,NSArray,NSSet要加类型后缀,不需要标明是否可变。

例如

NSString *accountName;
NSMutableArray *houseItemArray;
NSArray *apiHeaderArray;
NSDictory *keyDict;
BOOL isUpdated;
对于非简单类型,比如UIView,UIButton,Manager等,建议加上后缀

例如

UIView *moreView;
UIButton *downloadBtn;
GJFileManager *fileManager;
对于私有变量,尽量在.m中的category用@property声明,使用xCode自动定义的成员变量。如果自己声明,在.m中声明,且使用前缀”_”

例如

@interface()

@property(nonatomic,copy) NSString *name;

@end

@implement
{
UIEvent *_event;
}

-(instancetype)init
{
if(self = [super init]) {
_name = @”name”;
}
return self
}
@end
操作符
操作符(-、+、*、 /、 = 、 > 、 < 、 == )两侧留空格;*跟随在变量名左边。

例如

NSString *name = @”name”;

if(name.length > 10) {
NSLog(@”%@”,name);
}
返回类型
初始化方法(init、initWith…)的返回值使用intancetype;

例如

正确

-(instancetype)init;

错误

-(id)init;
方法名
方法名尽量可以将方法功能描述清楚,除了首个参数名之外,其他参数的描述参数和实参命名一致,首字母小写,按照驼峰法。在方法修饰符”-” 、”+”之后加一个空格。如果可能最好能描述实现方式。

正确

  • (void)getDataWithId:(int)id subId:(int)subId;

错误

-(void)getListWithid:(int)myId categoryId:(int)subId;

例如

  • (void)writeToFile;
  • (void)writeToMemory;
  • (void)writeToFileWithPath:(NSString)path isUpdateName:
  • (Bool)isUpdateName;
    嵌套方法调用需要用空格分隔

例如

正确

[[NSString alloc] init];

错误

[[NSString alloc]init];
单例方法使用shared前缀

例如

[FileManager shared]
[YWDUserManager shared];
类别category

原类型名”+”前缀+描述

例如

UIView+YWDFrameHelper
枚举
前缀+描述

每一项的命名为:枚举名+描述,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。

例如

正确

typedef NS_ENUM(NSInteger, YWDAPIState){
YWDAPIStateNew = 100,
YWDAPIStateOld = 200
} ;

错误

typedef enum {
YWDAPIStateNew = 100,
YWDAPIStateOld = 200
} YWDAPIState;
容器类操作
NSArray、NSDictionary、NSSet等都使用[]操作符来初始化容器及存取数据

例如

正确:

NSMutableArray *theArray = @[@”val1”,@”val2”];
NSString *name = theArray[0];
theArray[0] = @”newValue”;

NSMutableDictionary *theDic = @{@”key”:@”val”};
NSString *name = theDic[@”key”];
theDic[@”key”] = @”name”;

错误:

NSMutableArray = [NSMutableArray arrayWithObjects:@”val1”,@”val2”,nil];
NSString *name = [theArray objectAtIndex:0];
NSString *name = [theDic objectForKey:@”key”];
数字类型装箱
使用@操作符进行装箱

例如

正确:

int idx = 0;
theArray[0] = @idx;
BOOL isLoaded = YES;
theArray[0] = @isLoaded;

错误:

theArray[0] = [NSNumber numberWithInt:idx];
其他
所有的if判断都需要加上”{}”,包括单行语句

例如

正确:

if(i < 10) {
doSomething();
}

错误:

if(i < 10)
doSomething();

所有的ViewController在命名的时候以ViewController结尾。

例如

YWDProductViewController
YWDUserDetailViewController
所有的UITableViewCell,或者UICollectionViewCell类应该以Cell结尾,并且需要描述哪个业务或者模块的Cell。

例如

YWDProductListCell
YWDUserListCell
三元操作符尽量使用一层逻辑,避免多重三元操作符的使用。

正确:

NSInteger value = 5;
result = (value != 0) ? x : y;

BOOL isHorizontal = YES;
result = isHorizontal ? x : y;

错误

result = a > b ? x = c > d ? c : d : y;
代码组织
相关的方法都用#pragma mark标识

例如

pragma mark UITableViewDelegate Methods

pragma mark Public Methods

pragma mark Private Methods

pragma mark Life Cycle Methods

如果不容易表达,可以在mark后面写上中文

最佳实践
尽量用NSInteger和NSUInteger 替换int和long,因为NSInteger和NSUInteger兼容64-bit和32-bit,同理用CGFloat替换float

禁止在if中把BOOL类型的变量,直接和YES/NO,做比较,因为BOOL的类型是signed char,意味着BOOL不只有YES(1)和NO(0)两个值,在转换成YES/NO的时候,取决于最后一个字节,所以和我们想象的逻辑有可能不同。

正确
BOOL isOk = NO;
if (isOk) {
NSLog(@”进入”);
}

错误
BOOL isOk = NO;
if (isOk == NO) {
NSLog(@”进入”);
}
命名NSString的property的时候,使用copy,因为如果你给某个对象的NSString属性设置的字符串,然后进行了修改,那么会影响到那个属性的值。Block类型也要用copy修饰,防止对象被分配到栈上。

推荐
@property (nonatomic,copy) NSString *titleString;
@property (nonatomic,copy) void(^blockProperty)();

不推荐
@property (nonatomic,strong/retain) NSString *titleString;
@property (nonatomic,strong/retain) void(^blockProperty)();
参考文档

Google Objective-C Style Guide

Cocoa Style for Objective-c

raywenderlich Objective-C Style

Apple Coding Guidelines for Cocoa

导航菜单
登录页面讨论阅读查看源代码查看历史

首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
打印版本
固定链接
页面信息
本页面最后修改于2015年12月1日 (星期二) 07:15。
隐私政策关于ywd_wiki免责声明Powered by MediaWiki

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值