这个小系列是从 "Zen and the Art of the Objective-C Craftsmanship"中 进行的摘抄,共分成6篇,大部分是讲代码风格及美化,偶尔看看也不错。
- 原文GitHub地址:
https://github.com/objc-zen/objc-zen-book - 中文版GitHub地址:
https://github.com/oa414/objc-zen-book-cn
Category
-
category 方法前加上自己的小写前缀以及下划线。(真的很丑,但是苹果也推荐这样做)
- (id)zoc_myCategoryMethod
这是非常必要的。因为如果在扩展的 category 或者其他 category 里面已经使用了同样的方法名,会导致不可预计的后果。(会调用最后一个加载的方法)
// 推荐 @interface NSDate (ZOCTimeExtensions) - (NSString *)zoc_timeAgoShort; @end // 不推荐 @interface NSDate (ZOCTimeExtensions) - (NSString *)timeAgoShort; @end
-
推荐使用Category来根据不同功能对方法进行分组。
@interface NSDate : NSObject <NSCopying, NSSecureCoding> @property (readonly) NSTimeInterval timeIntervalSinceReferenceDate; @end @interface NSDate (NSDateCreation) + (instancetype)date; + (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs; + (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti; + (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs; + (instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date; // ... @end
NSNotification
当你定义你自己的 NSNotification 的时候你应该把你的通知的名字定义为一个字符串常量,就像你暴露给其他类的其他字符串常量一样。你应该在公开的接口文件中将其声明为 extern 的, 并且在对应的实现文件里面定义。
因为你在头文件中暴露了符号,所以你应该按照统一的命名空间前缀法则,用类名前缀作为这个通知名字的前缀。(通常在头文件中对外提供的常量都需要加上前缀,声明extern + const,并且并不是在头文件中定义,而是在实现文件中定义。如果不是对外公开的常量,那么通常直接在实现文件里声明为static + const,并且也要加上前缀,直接在后面进行定义。)
同时,用一个 Did/Will 这样的动词以及用 "Notifications" 后缀来命名这个通知也是一个好的实践。
// Foo.h
extern NSString * const ZOCFooDidBecomeBarNotification
// Foo.m
NSString * const ZOCFooDidBecomeBarNotification = @"ZOCFooDidBecomeBarNotification";
所有文章
【objc-zen-book】1.条件语句&Case语句的注意
【objc-zen-book】2.命名
【objc-zen-book】3.类
【objc-zen-book】4.Category & NSNotification
【objc-zen-book】5.美化代码 & 代码组织
【objc-zen-book】6.Block & self的循环引用