【问题标题】:Objective C - Custom @synthesize?Objective C - 自定义@synthesize?
【发布时间】:2011-08-16 12:36:44
【问题描述】:

是否有可能以某种方式创建自定义 @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";
}

【问题讨论】:

  • 不完全是一个解决方案,但可能感兴趣:stackoverflow.com/questions/1160498/…
  • 这种说法有帮助吗? @property (copy,setter=setDefaultTitle:) NSString* 标题;
  • Stefan 看起来真的很有趣。 setDefaultTitle 可以是另一个类中的类方法吗?
  • 不,我不这么认为。我想,您需要提供您自己的类的方法签名。

标签: objective-c properties getter synthesizer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    可能类似于 (Warning: Untested Code Ahead):

    #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
    

    【讨论】:

    • 有趣,但我该如何使用它?
    • @Rayan,纯 Objective-C 看起来好多了。当然,没有纯粹的方法来定义通用的 getter 或 setter,但 C-macrosses(在我看来)总比没有更糟糕。一旦我得到了一个带有这样的代码来支持和重构的项目——删除这样的宏是有史以来最好的重构:) 代码变得可读了。
    • 为什么里面有反斜杠?它们代表什么?
    • @aryaxt:他们转义换行符,使它们成为#define 的一部分。如果没有反斜杠,第一个换行符将被视为单行 #define 语句的结尾。
    • @Gobra 是的,我同意。这实际上是我使用该博客中的代码的原因。我宁愿每次都编写代码并使用模板而不是使用它。我提出它作为标准“否”答案的可能替代方案,不一定是这个问题的事实上的答案。就个人而言,我宁愿只在需要时复制/粘贴一段代码,而不是将其作为我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多