3

是否有可能以某种方式创建自定义 @synthesize 来生成自定义 getter、setter ?

例如:

@interface
@property (nonatomic, retain) MyObject *object;
@end

@implementation
@lazyInitialize object;
@end

然后以某种方式定义 @lazyInitialize 以生成惰性初始化方法

//@lazyInitialize

- (id)"property name"
{
   if (!"property name")
   {
      "property name" = [[["property name" class] alloc] init];
   }
   return "property name";
}
4

2 回答 2

5

不过,你可以尝试一些不同的东西。几天前我不会想到这一点,但我碰巧在读Cocoa With Love。在链接的帖子中,他讨论了他如何制作一个#define宏,该宏会将单例的整个类“生成”到您调用宏的任何位置。您可以为此下载他的代码(可能会就您自己的实现提供想法)。

可能类似于(警告:未测试代码):

#define SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(objectName, objectType) \
\
- (objectType *)objectName \
{ \
    if(!objectName) \
    { \
          objectName = [[objectType alloc] init]; \
    } \
    return objectName; \
} \
\
- (void)set##objectName:(objectType *)value \
{ \
    [value retain]; \
    [objectName release]; \
    objectName = value; \
}

会工作?抱歉,我没有时间为您正确测试它,因此请将此视为公平警告,这不是快速复制/粘贴解决方案。对于那个很抱歉。希望它仍然有用!;)


示例用法

这应该工作,再次警告:未经测试的代码提前

标题

// ....
@interface SomeClass : NSObject {
    NSObject *someObj;
}
@end

执行

@implementation SomeClass
// ....
SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(someObj, NSObject);
// ....
@end
于 2011-05-01T17:44:50.587 回答
2

@synthesizeObjective-C 中的自动属性语法与 C# 中的自动属性语法类似,因为两者都生成创建属性 getter/setter 所需的最少语法。在这两种语言中,如果您想要自定义功能,您需要手动实现它们。

我真的很喜欢Ryan Wersal使用 a#define来滚动你自己的宏的答案。您仍然需要自己编写方法,但您只需要编写一次。

于 2011-05-01T16:44:49.703 回答