Skip to content

Instantly share code, notes, and snippets.

@shu223
Last active December 12, 2017 06:32
Show Gist options
  • Save shu223/fbe45a0c1857cf8a5a8a5ebc89acb7a1 to your computer and use it in GitHub Desktop.
Save shu223/fbe45a0c1857cf8a5a8a5ebc89acb7a1 to your computer and use it in GitHub Desktop.
オープンソースAPI関連Tips

メソッドの使用を禁止する

- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

メソッド・プロパティをdeprecated/unavailableにする

参考: http://developer.wonderpla.net/entry/blog/engineer/LLVM_attribute/

@interface SomeClass : NSObject

/**
 *	To make deprecated
 */
@property (nonatomic, assign) CGFloat aProperty __attribute__ ((deprecated("Comment")));

/**
 *	To make unavailable
 */
@property (nonatomic, assign) CGFloat aProperty __attribute__ ((unavailable("Comment")));

@end

複数のBaseSDKに対応する

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000
@interface PulsingHaloLayer () <CAAnimationDelegate>
#else
@interface PulsingHaloLayer ()
#endif

解説

  • iOS 10から、CAAnimationDelegate に適合していることを宣言してないとwarningが出るようになった
  • しかしiOS 9以前のBaseSDKではCAAnimationDelegateはプロトコルとして定義されてなくて、ただのカテゴリである。そのため**<CAAnimationDelegate>と書くとビルドエラー**になる。
  • そして今はまだiOS 10はBetaなので、cocoapodsにpodspecをpushしようとすると、あっちでiOS 9.3SDKでビルドが走り、ビルドエラーになる
  • というわけで上のような場合分けが必要

参考:

補足

  • #if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_10_0 とは書けない。低いBaseSDKでビルドするとき、そのマクロが定義されてないと0として扱われ、判定結果が変わってしまうので。

App Extensionかどうかをビルド時に判定する

親アプリとの共用コード等で、UIApplicationまわりの処理を分岐させるときとかに使う。

#if !(defined(__has_feature) && __has_feature(attribute_availability_app_extension))
  //Not in the extension
#else
  //In extension
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment