QMUILab.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /**
  2. * Tencent is pleased to support the open source community by making QMUI_iOS available.
  3. * Copyright (C) 2016-2021 THL A29 Limited, a Tencent company. All rights reserved.
  4. * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
  5. * http://opensource.org/licenses/MIT
  6. * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
  7. */
  8. //
  9. // QMUILab.h
  10. // QMUIKit
  11. //
  12. // Created by MoLice on 2019/J/8.
  13. //
  14. #ifndef QMUILab_h
  15. #define QMUILab_h
  16. #import <Foundation/Foundation.h>
  17. #import <UIKit/UIKit.h>
  18. #import <objc/runtime.h>
  19. #import "QMUICommonDefines.h"
  20. #import "NSNumber+QMUI.h"
  21. #import "QMUIWeakObjectContainer.h"
  22. /**
  23. 以下系列宏用于在 Category 里添加 property 时,可以在 @implementation 里一句代码完成 getter/setter 的声明。暂不支持在 getter/setter 里添加自定义的逻辑,需要自定义的情况请继续使用 Code Snippet 生成的代码。
  24. 使用方式:
  25. @code
  26. @interface NSObject (CategoryName)
  27. @property(nonatomic, strong) type *strongObj;
  28. @property(nonatomic, weak) type *weakObj;
  29. @property(nonatomic, assign) CGRect rectValue;
  30. @end
  31. @implementation NSObject (CategoryName)
  32. // 注意 setter 不需要带冒号
  33. QMUISynthesizeIdStrongProperty(strongObj, setStrongObj)
  34. QMUISynthesizeIdWeakProperty(weakObj, setWeakObj)
  35. QMUISynthesizeCGRectProperty(rectValue, setRectValue)
  36. @end
  37. @endcode
  38. */
  39. #pragma mark - Meta Marcos
  40. #define _QMUISynthesizeId(_getterName, _setterName, _policy) \
  41. _Pragma("clang diagnostic push") _Pragma(ClangWarningConcat("-Wmismatched-parameter-types")) _Pragma(ClangWarningConcat("-Wmismatched-return-types"))\
  42. static char kAssociatedObjectKey_##_getterName;\
  43. - (void)_setterName:(id)_getterName {\
  44. objc_setAssociatedObject(self, &kAssociatedObjectKey_##_getterName, _getterName, OBJC_ASSOCIATION_##_policy##_NONATOMIC);\
  45. }\
  46. \
  47. - (id)_getterName {\
  48. return objc_getAssociatedObject(self, &kAssociatedObjectKey_##_getterName);\
  49. }\
  50. _Pragma("clang diagnostic pop")
  51. #define _QMUISynthesizeWeakId(_getterName, _setterName) \
  52. _Pragma("clang diagnostic push") _Pragma(ClangWarningConcat("-Wmismatched-parameter-types")) _Pragma(ClangWarningConcat("-Wmismatched-return-types"))\
  53. static char kAssociatedObjectKey_##_getterName;\
  54. - (void)_setterName:(id)_getterName {\
  55. objc_setAssociatedObject(self, &kAssociatedObjectKey_##_getterName, [[QMUIWeakObjectContainer alloc] initWithObject:_getterName], OBJC_ASSOCIATION_RETAIN_NONATOMIC);\
  56. }\
  57. \
  58. - (id)_getterName {\
  59. return ((QMUIWeakObjectContainer *)objc_getAssociatedObject(self, &kAssociatedObjectKey_##_getterName)).object;\
  60. }\
  61. _Pragma("clang diagnostic pop")
  62. #define _QMUISynthesizeNonObject(_getterName, _setterName, _type, valueInitializer, valueGetter) \
  63. _Pragma("clang diagnostic push") _Pragma(ClangWarningConcat("-Wmismatched-parameter-types")) _Pragma(ClangWarningConcat("-Wmismatched-return-types"))\
  64. static char kAssociatedObjectKey_##_getterName;\
  65. - (void)_setterName:(_type)_getterName {\
  66. objc_setAssociatedObject(self, &kAssociatedObjectKey_##_getterName, [NSNumber valueInitializer:_getterName], OBJC_ASSOCIATION_RETAIN_NONATOMIC);\
  67. }\
  68. \
  69. - (_type)_getterName {\
  70. return [((NSNumber *)objc_getAssociatedObject(self, &kAssociatedObjectKey_##_getterName)) valueGetter];\
  71. }\
  72. _Pragma("clang diagnostic pop")
  73. #pragma mark - Object Marcos
  74. /// @property(nonatomic, strong) id xxx
  75. #define QMUISynthesizeIdStrongProperty(_getterName, _setterName) _QMUISynthesizeId(_getterName, _setterName, RETAIN)
  76. /// @property(nonatomic, weak) id xxx
  77. #define QMUISynthesizeIdWeakProperty(_getterName, _setterName) _QMUISynthesizeWeakId(_getterName, _setterName)
  78. /// @property(nonatomic, copy) id xxx
  79. #define QMUISynthesizeIdCopyProperty(_getterName, _setterName) _QMUISynthesizeId(_getterName, _setterName, COPY)
  80. #pragma mark - NonObject Marcos
  81. /// @property(nonatomic, assign) Int xxx
  82. #define QMUISynthesizeIntProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, int, numberWithInt, intValue)
  83. /// @property(nonatomic, assign) unsigned int xxx
  84. #define QMUISynthesizeUnsignedIntProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, unsigned int, numberWithUnsignedInt, unsignedIntValue)
  85. /// @property(nonatomic, assign) float xxx
  86. #define QMUISynthesizeFloatProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, float, numberWithFloat, floatValue)
  87. /// @property(nonatomic, assign) double xxx
  88. #define QMUISynthesizeDoubleProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, double, numberWithDouble, doubleValue)
  89. /// @property(nonatomic, assign) BOOL xxx
  90. #define QMUISynthesizeBOOLProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, BOOL, numberWithBool, boolValue)
  91. /// @property(nonatomic, assign) NSInteger xxx
  92. #define QMUISynthesizeNSIntegerProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, NSInteger, numberWithInteger, integerValue)
  93. /// @property(nonatomic, assign) NSUInteger xxx
  94. #define QMUISynthesizeNSUIntegerProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, NSUInteger, numberWithUnsignedInteger, unsignedIntegerValue)
  95. /// @property(nonatomic, assign) CGFloat xxx
  96. #define QMUISynthesizeCGFloatProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, CGFloat, numberWithDouble, qmui_CGFloatValue)
  97. /// @property(nonatomic, assign) CGPoint xxx
  98. #define QMUISynthesizeCGPointProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, CGPoint, valueWithCGPoint, CGPointValue)
  99. /// @property(nonatomic, assign) CGSize xxx
  100. #define QMUISynthesizeCGSizeProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, CGSize, valueWithCGSize, CGSizeValue)
  101. /// @property(nonatomic, assign) CGRect xxx
  102. #define QMUISynthesizeCGRectProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, CGRect, valueWithCGRect, CGRectValue)
  103. /// @property(nonatomic, assign) UIEdgeInsets xxx
  104. #define QMUISynthesizeUIEdgeInsetsProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, UIEdgeInsets, valueWithUIEdgeInsets, UIEdgeInsetsValue)
  105. /// @property(nonatomic, assign) CGVector xxx
  106. #define QMUISynthesizeCGVectorProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, CGVector, valueWithCGVector, CGVectorValue)
  107. /// @property(nonatomic, assign) CGAffineTransform xxx
  108. #define QMUISynthesizeCGAffineTransformProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, CGAffineTransform, valueWithCGAffineTransform, CGAffineTransformValue)
  109. /// @property(nonatomic, assign) NSDirectionalEdgeInsets xxx
  110. #define QMUISynthesizeNSDirectionalEdgeInsetsProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, NSDirectionalEdgeInsets, valueWithDirectionalEdgeInsets, NSDirectionalEdgeInsetsValue)
  111. /// @property(nonatomic, assign) UIOffset xxx
  112. #define QMUISynthesizeUIOffsetProperty(_getterName, _setterName) _QMUISynthesizeNonObject(_getterName, _setterName, UIOffset, valueWithUIOffset, UIOffsetValue)
  113. #endif /* QMUILab_h */