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