【objc-zen-book】4.Category & NSNotification

这个小系列是从 "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

  1. category 方法前加上自己的小写前缀以及下划线。(真的很丑,但是苹果也推荐这样做)

    - (id)zoc_myCategoryMethod
    

    这是非常必要的。因为如果在扩展的 category 或者其他 category 里面已经使用了同样的方法名,会导致不可预计的后果。(会调用最后一个加载的方法)

    // 推荐
    @interface NSDate (ZOCTimeExtensions)
    - (NSString *)zoc_timeAgoShort;
    @end
    
    // 不推荐
    @interface NSDate (ZOCTimeExtensions)
    - (NSString *)timeAgoShort;
    @end
    
  2. 推荐使用Category来根据不同功能对方法进行分组。

    @interface NSDate : NSObject 
    
    @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的循环引用

你可能感兴趣的:(【objc-zen-book】4.Category & NSNotification)