objective-c - 在 Objective-C 中添加 Objective @property 属性

标签 objective-c cocoa cocoa-touch

有谁知道在不修改编译器的情况下向 @property 关键字添加其他属性类型的方法吗?或者有人能想到另一种方法来通用化 getter/setter 创建吗?

基本上,我在最近的项目中有很多案例,其中对象可以很方便地延迟实例化其数组属性。这是因为我们有“事件”对象,它们可以有各种各样的集合作为属性。特定事件的子类化是不可取的,因为许多属性是共享的,这将成为可用性的噩梦。

例如,如果我有一个包含歌曲数组的对象,我会编写如下所示的 getter:

- (NSMutableArray *)songs {
    if (!songs) {
        songs = [[NSMutableArray alloc] init];
    }

    return songs;
}

与其编写数十个这样的 getter,不如通过...来获取行为真是太好了

@property (nonatomic, retain, lazyGetter) NSMutableArray *songs;

也许通过#defines 之类的一些花哨的技巧?还有其他想法吗?

最佳答案

您始终可以使用宏。即使您修改了编译器,您可能仍然希望在 @synthesize 而不是 @property 中执行此操作,因为无需发布此实现细节。通过宏,可以轻松使用任何 init 方法。不幸的是,宏不知道 getter= property 属性。

#define synthesizeLazyGetterWithInit(PROPERTY,TYPE,INIT)\
-(TYPE *) PROPERTY { if ( !PROPERTY ) { PROPERTY=[[TYPE alloc] INIT]; } return PROPERTY; }

#define synthesizeLazyGetter(PROPERTY,TYPE)\
synthesizeLazyGetterWithInit(PROPERTY,TYPE,init)

@implementation MyClass

synthesizeLazyGetter(songs,NSMutableArray)
synthesizeLazyGetterWithInit(other,NSMutableArray,initWithCapacity:0)

@end

编辑:

#define synthesizeLazyGetterOptional(PROPERTY,TYPE,INIT);\
-(TYPE *) PROPERTY:(BOOL)inAllocate { if ( !PROPERTY && inAllocate ) { PROPERTY=[[TYPE alloc] INIT]; } return PROPERTY; }\
-(TYPE *) PROPERTY { return [self PROPERTY:YES]; }\
-(BOOL) PROPERTY##Initialized { return nil != PROPERTY; }

关于objective-c - 在 Objective-C 中添加 Objective @property 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814713/

相关文章:

ios - 获取应用内购买的订阅到期日期 - 从 appStoreReceiptURL 开始

xcode - Icon Composer 不适用于 Xcode 4.3?

iOS - 在滚动之前移动 TableView

objective-c - 自定义 UINavigationController UIToolbar 背景图片

ios - 无论IOS显示什么 View ,都能检测到从屏幕左侧滑动吗?

ios - 如何像 Ola 应用程序一样在 Google map 上移动标记

iphone - CALayers 没有在其 UIView 的边界更改时调整大小。为什么?

objective-c - 文档表不响应键盘事件

iphone - 绘制不连续的数学表达式?

ios - 绘制 PDF 时的 CFAttributedString