gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:30:06 24 4
gpt4 key购买 nike

有谁知道在不修改编译器的情况下向 @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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com