1.iOS切图文件的命名规范
命名规则的基本思想是把文件名分成三部分,第一部分是图片的逻辑归属分类,第二部分是图片的表现内容,第三部分是图片的内容的类型,有些图片还会有第四部分,表示图片表现的状态。首先有3个规则是:
(1)用英文命名,不用拼音
(2)每一部分用下划线分隔
(3)图片名中两倍图在名字最后要加@2x,三倍图在名字最后要加@3x
2.类的布局
程序布局的目的是显示出程序良好的逻辑结构,提高程序的准确性、连续性、可读性、可维护性。更重要的是,统一的程序布局和编程风格,有助于提高整个项目的开发质量,提高开发效率,降低开发成本。同时,对于普通程序员来说,养成良好的编程习惯有助于提高自己的编程水平,提高编程效率。因此,统一的、良好的程序布局和编程风格不仅仅是个人主观美学上的或是形式上的问题,而且会涉及到产品质量,涉及到个人编程能力的提高,必须引起大家重视。
(1).文件布局
1).文件头一
#import (依次为标准库头文件、非标准库头文件)
全局宏
常量定义
全局数据类型
类定义
2).文件头二
#import (依次为标准库头文件、非标准库头文件)
文件内部使用的宏
常量定义
文件内部使用的数据类型
全局变量
本地变量(即静态全局变量)
类的实现
(2).类结构布局
使用#pragma mark –来分类方法
#pragma mark – Life Cycle
#pragma mark - Events
#pragma mark – Private Methods
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark - Custom Delegates
#pragma mark – Getters and Setters
(3).布局中的空格
每个方法或者功能块之间为了结构清晰,应当有且只有一行空格。
@interface SomeClass:NSObject
@property (noatomic, strong) UIView *aView
- (void)someMethod;
@end
@implementation SomeClass
- (void)setAView:(NSInteger )aview {
}
- (void)someMethod {
}
@end
(4).关于布局中的Private Methods块
正常情况下ViewController里面不应该写不是delegate方法的,不是event response方法的,不是life cycle方法的,就是private method了。对的,正常情况下ViewController里面一般是不会存在private methods的,这个private methods一般是用于日期换算、图片裁剪啥的这种小功能。这种小功能要么把它写成一个category,要么把他做成一个模块,哪怕这个模块只有一个函数也行。
ViewController基本上是大部分业务的载体,本身代码已经相当复杂,所以跟业务关联不大的东西能不放在ViewController里面就不要放。另外一点,这个private method的功能这时候只是你用得到,但是将来说不定别的地方也会用到,一开始就独立出来,有利于将来的代码复用。
(5).属性初始化放哪最好?
苹果之所以选择让[self getProperty]和self.property可以互相通用,这种做法已经很明显地表达了苹果的倾向:希望每个property都是通过getter方法来获得。认为最好的地方还是放在getter里面,结合单例模式之后,代码会非常整齐,生产的地方和使用的地方得到了很好的区分。
一个对象的"私有"属性写在extension里面,然后这些属性的初始化全部放在getter里面做,在init和dealloc之外,是不会出现任何类似_property这样的写法的。就是这样:
@interface CustomObject()
@property (nonatomic, strong) UILabel *label;
@end
@implementation
//1.懒加载设置基本属性
#pragma mark - getters and setters
- (UILabel *)label {
if (_label == nil) {
_label = [[UILabel alloc] init];
_label.text = @"1234";
_label.font = [UIFont systemFontOfSize:12];
... ...
}
return _label;
}
@end
#pragma mark - life cycle
//2.添加控件到父控件上
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.label];
}
//3.设置frame
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.label.frame = CGRectMake(1, 2, 3, 4);
}
(6).Getters and Setters放在最底部
控制器可能会有非常多的view属性和其他属性,如果所有的getters and setters放在前面,就会导致在implementation代码顶部有大量的初始化代码,这就导致主要的逻辑代码挪到后面去了,其他人阅读代码是不太方便的。