股票场内基金交易,没时间盯盘?
本文可以看做是我对《Effective Objective-C 2.0》一书做的学习笔记。
在头文件中尽量使用向前声明而非直接引用其它头文件
我们在头文件中声明属性和方法时,总免不了要引用其它的类,一个很自然的想法是用 “#import” 将头文件直接引用过来。
这种办法可行,但既不高效也不优雅。因为一旦引用这个头文件,就会一并引用 import 进来的其它头文件中的全部内容,增加编译时间,而我们通常只是需要这些类的类名。
因此推荐的方法是使用向前声明:
1 2 |
@class 类名; |
然后再实现文件中在引入声明的类的头文件。
当然,有时候是必须引用其它头文件的。如果我们的类继承自某个超类(比如 UIKit),那么必须引入那个超类的头文件。
我们可以随意点进一个 UI 控件的头文件,感受和理解苹果的使用规范。
尽量使用类型常量而非宏定义
编写代码时经常要定义常量。比如给控件布局时需要一个间距常量,熟悉 C 语言的话很容易想到宏定义:
1 2 |
#define PADDING 10 |
在 Objective-C 中,我们是不推荐这么做的,采用 #define 预处理指令定义出来的常量不包含类型信息,编译器只会在编译前进行查找和替换的操作。即使有人重新定义了常量值,编译器也不会产生警告信息,从而导致程序中常量不一致。
如果常量只局限于这个实现文件内使用,我们建议用如下方式定义:
1 2 |
static const CGFloat kPadding = 10; |
static 和 const 表示这是个仅在本文件内有效的不可更改的常量,CGFloat 定义了该常量的类型。这种定义方式更加清晰明确,也便于理解。注意常量的命名,按约定俗成的习惯需加上字母 k 作为前缀。
对于需要全局声明的常量,比如通知信息,则采用如下方式:
假设类名为 TIMTest,实现文件中定义:
1 2 |
NSString *const TIMTestNotification = @"TIMTestNotification"; |
头文件中声明:
1 2 |
UIKIT_EXTERN NSString *const TIMTestNotification; |
作为全局声明的常量,通常采用类名做前缀。
用枚举表示状态和选项
开发中频繁需要从外界引入条件进行判断,通常对于简单的是非判断,使用 BOOL 属性也足够了,但如果是一系列状态或是选项,枚举就是最佳的选择。
在 Xcode 中输入 “enum” 可以索引到苹果提供的模板:
1 2 3 4 5 6 |
typedef enum : NSUInteger { MyEnumValueA, MyEnumValueB, MyEnumValueC, } MyEnum; |
同样的,为便于识别,枚举名要以类名为前缀。
这里还有一点引申,以 UIControl 类中表示控件状态的 UIControlState 枚举为例
1 2 3 4 5 6 7 8 9 10 |
typedef NS_OPTIONS(NSUInteger, UIControlState) { UIControlStateNormal = 0, UIControlStateHighlighted = 1 << 0, UIControlStateDisabled = 1 << 1, UIControlStateSelected = 1 << 2, UIControlStateFocused = 1 << 3, UIControlStateApplication = 0x00FF0000, UIControlStateReserved = 0xFF000000 }; |
此处表示当枚举没引用时从 UIControlStateHighlighted 到 UIControlStateFocused 四个成员可以彼此通过按位或运算符”|”进行组合。
在对像内部尽量采用存取方法(点语法)访问声明属性
除了存取方法外,在对象内我们还可以直接访问实例变量。但除了在存取方法内部必须调用外,在其它方法中设置这个属性时最好采用存取方法。
直接访问属性的话,并不会调用存取方法,所得到得值可能和我们想要的有出入。比如在 UITableViewController 中声明一个数据模型数组 dataArray,并在其 getter 方法中实现数据导入。可如果在后续的数据源和代理方法中直接使用 _dataArray 访问和设置,由于没有调用 getter 方法,显然 _dataArray 为空,不会显示任何数据。
用前缀避免命名空间冲突
Objective-C 中并没有其它语言的命名空间机制,如果发生了命名冲突,那么程序的链接过程就会报错。避免此问题的唯一方法是变相实现命名空间:为所有名称加上前缀。所选的前缀可以是公司、个人或项目相关的简称。虽然也难保不出现冲突,但几率肯定小很多。
需要注意的是苹果宣称保留其使用两个字母前缀的权利,为避免潜在的麻烦,我们可以把钱追定位三个字母。
description 方法妙用
调试程序时经常会通过打印查看对象信息:
1 2 |
NSLog(@"%@",object); |
实际上是返回 object 对应类的 description 方法输出的字符串。但有时候(尤其是在自定义类上),打印出的结果并非我们想要的。一种方法是直接打印需要的属性,不过如果打印次数增多就会显得繁琐。因此更好的方法是覆写 description 方法自定义需要的返回信息,同时还可以返回外界无法访问的私有属性,便于调试。
1 2 3 4 5 6 7 8 9 |
- (NSString *)description{ return [NSString stringWithFormat:@"<%@: %p, %@>",[self class], self, @{@"object1": object1, @"object2": object2, @"object3": object3} ]; } |
想获得去掉 5 元限制的证券账户吗?

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。
请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。