Objective C - 自定义 @synthesize?

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";
}

不是一个确切的解决方案,但可能会引起兴趣:https://dev59.com/93M_5IYBdhLWcg3w8IDR - SteAp
3
这种类型的语句有帮助吗?@property (copy,setter=setDefaultTitle:) NSString* title; - SteAp
Stefan,这看起来非常有趣。在另一个类中,setDefaultTitle可以成为一个类方法吗? - aryaxt
不,我不这么认为。我想你需要提供自己类的方法签名。 - SteAp
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

有趣,但我该如何使用它呢? - aryaxt
@Rayan,纯Objective-C看起来更好。当然,没有纯粹的方法来定义通用的getter或setter,但是C宏(在我看来)比什么都不好。有一次我接手了一个这样的代码项目进行支持和重构 - 删除这些宏是最好的重构 :) 代码变得可读了。 - Gobra
1
@Gobra 是的,我完全同意。这就是为什么我 使用那个博客中的代码的原因。我宁愿每次撰写代码并从模板中工作,也不愿使用这个。我将其提出作为对标准“否”回答的可能替代方案,而不一定是这个问题的实际解决方案。就个人而言,我宁愿只有一个需要复制/粘贴的代码片段,而不是采用这种方式来解决问题。 - Ryan Wersal
@Ryan,你能解释一下我如何使用你提供的代码吗?我应该在哪里写这段代码?我已经在我的prefic.pch中定义了它,并且我在一个viewController的viewDidLoad中尝试了类似于这样的东西:SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT("WebServiceClient", "webService");,但是我得到了以下错误:"expected expression before ')' token." - aryaxt
@aryaxt 从评论来看,大家都同意你的观点(包括我自己),所以绝对没有什么不愉快的感觉。很抱歉它对你的情况(或任何情况)都不太适用! - Ryan Wersal
显示剩余3条评论

2
在Objective-C中,@synthesize的工作方式类似于C#中的自动属性语法,两者都生成创建属性getter/setter所需的最小语法。在这两种语言中,如果您需要自定义功能,则需要手动实现它们。
我非常喜欢Ryan Wersal的答案,使用#define来编写自己的宏。您仍然需要自己编写方法,但只需要编写一次即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接