在objective-c中添加一个客观的@property属性

时间:2010-05-11 21:52:59

标签: 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或其他什么花哨的技巧?其他想法?

1 个答案:

答案 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; }