如何将DRY(不要重复自己)带到Objective-C

时间:2009-07-31 21:48:46

标签: objective-c properties dry

我从Ruby到Objective-C,我一直在做:

NSObject *foo;

@property (nonatomic,retain) NSObject *foo;
<。>在.h文件中,然后在.m文件中:

@synthesize foo;

位于顶部,

[foo release]

in dealloc。

添加foo是4个步骤!经验丰富的Objective-C程序员每次想要在一个类中添加新的实例变量时都会手动完成所有四个步骤吗?我错过了制作这种干燥的方法吗?

6 个答案:

答案 0 :(得分:6)

这也是C ++中的一个常见问题(声明加倍,尽管它确实有点不同)。简短的回答是它是如何构建语言的。因为每个陈述都是独一无二的,并且有其自己的目的,所以它并不真正反对DRY。然而,按照今天的标准,它无疑是非常冗长的。

答案 1 :(得分:3)

此页http://pragprog.com/magazines/2010-07/not-quite-new-in-ios-声明,您可以删除变量声明,仅将其重复为2次重复:)

#import <UIKit/UIKit.h>
@interface MoveMeViewController : UIViewController {
}

@property(nonatomic, retain) IBOutlet UIImageView *imageView;
@end

答案 2 :(得分:1)

既然你提到你是Objective-C的新手,我想确保你知道你不必为你的类中的每个实例变量创建属性,事实上你可能不应该。

属性表示您的类为其他类提供的接口。此接口不一定与类的内部实现相匹配。在它们相同的情况下,声明的属性语法使得(相对)简单地表达它。

如果您的课程通过属性暴露其大部分内部状态,您可能需要仔细研究他们的设计,以及是否可以通过调整职责来获得更简单的设计。

答案 3 :(得分:0)

Objective-C是一个非常薄的层。在较低的层次上,大多数“目标”的东西都会编译成注入C编译过程的代码指针。

他们确实添加了引用计数(最基本的垃圾收集系统),但由于它的性质,它都是手工完成的,因此“释放”调用。

非iPhone版本增加了一个真正的垃圾收集系统,但这些系统也没有缩小,因为释放不是那么确定。

保持对象小而且集中,属性语法不应该非常具有侵略性。

答案 4 :(得分:0)

是的,但我希望每天都有人会为XCode提供一个脚本或其他东西来实现自动化。 (我也更喜欢

self.foo = nil 

在我的deallocs中)

答案 5 :(得分:0)

一旦忘记32位计算机,您将能够绕过必须声明实例变量和属性,因为64位运行时可以合成实例变量。但是,你必须在一个必须在头文件中声明事物并在另一个文件中实现的语言中完全干掉。该语言需要重复。唯一的方法是创建一个元语言。

您可以使用脚本来消除重复输入相同变量样板的重复,但它仍将存在于代码中。

顺便说一下,我认为@synthesize语句不是重复信息。您的代码中没有任何其他内容表明用于访问该属性的访问者。