有没有人知道在不修改编译器的情况下向@property关键字添加其他属性类型的方法?或者任何人都可以想到另一种将getter / setter创建泛化的方法吗?
基本上,我在最近的一个项目中有很多案例,对象懒得实例化它们的数组属性很方便。这是因为我们有“事件”对象,可以将各种集合作为属性。对特定事件进行子类化是不可取的,因为许多属性是共享的,并且它将成为可用性的噩梦。
例如,如果我有一个带有一系列歌曲的对象,我会写一个像下面这样的getter:
- (NSMutableArray *)songs {
if (!songs) {
songs = [[NSMutableArray alloc] init];
}
return songs;
}
不是写几十个这样的getter,而是通过......来获取行为真的很好。
@property (nonatomic, retain, lazyGetter) NSMutableArray *songs;
也许通过#defines或其他什么花哨的技巧?其他想法?
答案 0 :(得分:4)
您始终可以使用宏。即使您修改了编译器,您仍可能希望在@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; }