objective-c代码规范

关于注释:

1.新建类或修改类的时候,注意在controller类名或者独立的View组件类名上,加上这个页面的名称描述注释。举例:如STJobPerfectViewController 学生身份的职责完善页面
2.每个.h文件顶部创建人姓名必须是中文拼音,不能随意定制英文名。举例:// Created by iOnRoad on 2017/7/12.
3.下掉的功能和页面直接删除掉就可以了,不能直接简单的屏蔽掉。想要对比参照可以找老版本。
属性声明
1.公开属性在.h中声明,私有属性在.m中声明
@property (nonatomic, assign) NSInteger number;
2.
3.声明变量时,尽可能指定类型,不要使用id代替。
4.@property声明属性时,必须指定assign,weak,copy,strong等,不能省略。
5.局部变量不能使用下划线作为前缀。

常量声明,不要采用#define。

static const NSInteger kGetCodeTimeInterval = 30;

方法声明

1.-后面与方法名间加空格, { 前加空格,多参数不需要and等连接语句,参数之间加空格。

  • (NSInteger)ageWithPerson:(Person *)person country:(Country *)country {
    … //implementation
    }

3.方法之间用换行隔开一行。
4.方法大括号和其他大括号紧随语句,不要换行。
5.方法需要归类,不要随意摆放,以 #pragma mark - 隔开,顺序为系统方法放在最前面,其次是公开方法,其次是私有方法,其次是委托,其他。
#pragma mark - system
//此处需要换行隔开

  • (void)viewDidLoad {
    }
    //此处需要换行隔开
    #pragma mark - public

    #pragma mark - private

    #pragma mark - xxx delegate

    #pragma mark - yyy delegate

    #pragma mark - other

7.方法有返回值时,方法命名以返回值语意作为开头

  • (NSInteger)age {
    return 20;
    }

9.在方法内,不同变量的定义使用,需要换行隔开,不要堆在一起。

  • (void)initPropertyInfo {
    _usernameLabel = [[UILabel alloc] init];
    self.usernameLabel.text = @“测试”;
    //注意:此处需要回车换行来隔开。
    _imTableView = [[UITableView alloc] init…];
    _imTableView.delegate = self;
    }

11.方法命名以方法功能语意作为方法名解析,而不是根据点击事件或随机。
//推荐

  • (void)submitRechargeRequest:(NSInteger)coinNumber {
    }
    //不推荐
  • (void)tapSubmitButton:(NSInteger)coinNumber {
    }

类声明

1.以项目名大写缩写作为前缀,以功能名定义,以继承的系统类名字结尾。
#import <UIKit/UIKit.h>
@interface FBWelfareViewController

@end
2.
3.#import 与 @interface 或 @implementation 需要回车隔开。

枚举声明

1.以项目名大写缩写作为前缀,成员类型名字前面追加枚举名字
typedef NS_ENUM(NSInteger, FBCellStyle) {
FBCellStyleSystemDefault,
FBCellStyleSystemValue1,
};
2.

委托声明

1.声明委托时,尽量把调用者作为参数进行声明,既能获取值传递,也能明确知道谁在调用。
@protocol ImageClickDelegate

  • (void)imageContainerView:(ImageContainerView *)containerView replaceImage:(UIImage *)image;

@end

@ineterface ImageContainerView : UIView

@property (nonatomic, weak) id delegate;

@end

@implementation

  • (void)invokeMethod {
    if([delegate respondsToSelector:@selector(imageContainerView:replaceImage:)]){
    [delegate imageContainerView:self replaceImage:image];
    }
    }

@end
2.

命名规则,采用驼峰式

1.变量命名按语意命名,如userLoginInfo;
2.常量需以k开头,并加上const防止被修改,如kGetCodeTimeInterval;
3.控件命名需要追加控件标识,如usernameLabel;
4.中间变量s以tmp开头,如tmpUsername;

语句判断

1.针对nil,bool判断
//推荐
if (boolValue) {
}
if (objectValue) {
}
//不推荐
if (boolValue == YES) {
}
if (objectValue != nil) {
}
2.
3.单语句条件赋值
id result = object ? : otherObject;
//或
BOOL result = age > 0
4.
5.单语句中,只允许使用一次三元运算符。
6.判断固定值时,将固定值放在判断前面。
if ([@“abc” isEqualToString:str]) {
}
7.
8.if 或 case语句,不要省略后面的大括号,
if(xx) { } 或case 0: { }。
9.
10.标准的if else 写法
//注意条件语句中的空格。
if (condition) {
…implemetion
} else {
…implemetion
}
11.
12.判断语句时,如有返回值,尽快返回。注意黄金路径。
//推荐
if (condition) {
retrurn NO;
};

return YES;

//不推荐
Bool boolValue;
if (condition) {
boolValue = YES;
} else {
boolValue = NO;
}
return boolValue;
13.

初始化

1.采用字面量初始化
NSArray *array = @[];
NSMutableArray *mutArray = [@[] mutableCopy];
NSDictioanry *dict = @{@“key”😡“value”, @“key1”😡“value1”};
NSString *string = @“abc”;
NSNumber *number = @(10);
2.
3.成员变量初始化时,采用_str = @[ (a,)b]; 来避免getter/setter的副作用。
4.成员变量用self.来调用, 局部变量直接调用。
5.init方法返回instancetype类型,而不是id。
@property (strong, nonatomic) NSMutableArray *stringArray;

  • (instancetype)init {
    self = [super init];
    if (self) {
    //推荐
    _stringArray = [@[@“a”,@“b”] mutableCopy];
    [self.stringArray addObject:@“c”];
    //不推荐
    self.stringArray = [@[@“a”,@“b”] mutableCopy];

      //局部变量,用self.来区分
      NSString *string = @"d";
      [self.stringArray addObject:string];
    

    }
    }

7.尽量在使用的时候才声明变量,尽量少用成员变量。

其他实战项目规则

1.缩进符,以Tab键为缩进,不要打空格。
2.@interface 与 成员变量声明需要加隔开一行,与方法声明也换行隔开。
@interface FBWelfareViewController : UIViewController
//此处,隔开一行
@property (copy, nonatomic) NSString *welfareDesp;  …
//此处再隔开一行,开始方法声明

  • (void)setupUI;

@end
3.
4.用到的成员变量,需要直接声明,而不是通过字典隐式获取。
@property (assign, nonatomic) NSInteger age;

  • (void)upValue:(NSDictionary *)param {
    self.age = [param[@“age”] integerValue];
    }

  • (void)setupUI {
    //推荐
    self.ageLabel.text = [@(self.age) stringValue];;
    //不推荐
    self.ageLabel.text = [NSString stringWithFormat:@"%@",self.parameter[@“age”]];
    }

6.在viewDidLoad中,初始化成员信息统一放在最前面,换行隔开后,然后再分别处理各个变量,同时不同的变量处理也需要换行隔开。

  • (void)viewDidLoad {
    self.age = 0;
    _imArray = [@[] mutableCopy];
    _usernameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    //此处,隔开一行
    [self.imArray addObject:@“a”];
    if ([self ageWithPerson:person] > 0) {
    [self.imArray addObject:@“b”];
    }
    //此处,在隔开一行
    self.usernameLabel.backgroundColor = [UIColor clearColor];
    self.usernameLabel.text = @“初始化值”; }

8.视图中,尽可能不要出现model的身影,需要外界可控的控件开发在.h中,或者以方法参数的传递来修改内部控件的属性。
@interface FBCoinInputTextField

@property (weak, nonatomic) IBOutlet UILabel *coinTitleLabel; //该coinTitleLabel是外界可以改变的,需开放出来

//推荐

  • (void)fillTextFieldWithContent:(NSString *)content placeHolder:(NSString *)placeHolder font:(UIFont *)font;
    //不推荐
  • (void)fillTextFieldWithResponse:(FBWelfareResponse *)response;

@end
9.

关于换行

1.在.h文件中的换行原则
2.在.m文件中的换行原则
3.文件说明与头文件包涵(#import)之间换行
4.头文件包涵(#import)之间,如果需要分类区别,各类别之间换行
5.头文件包涵(#import)与@class之间换行
6. (interface与)class之间换行
7.@inteface 与 @property 之间换行
8.@property 与 方法声明 之间换行
9.方法 与 @end 之间换行
10.文件说明与头文件包涵(#import)之间换行。
11.头文件包涵(#import)之间,如果需要分类区别,各类别之间换行。
12.各方法之间换行。
13.#pragma mark - 与方法之间换行。

关于空格

@property (weak, nonatomic) NSString string;
1…h中采用协议时,<>前面有1个空格
2…h中成员声明时,类型与变量之间有至少1个空格。号靠近变量,不靠近类型。
3.@property与()有1空格,()里面逗号后有1个空格,()后留1个空格,再声明属性
4.方法+,-后,与()之间有1个空格
5.返回类型与
之间有1个空格,方法参数中返回类型与
之间有1个空格
6.多参数的方法,每一个参数后面都有1个空格
7.对象与调用方法之间,有1个空格。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值