5

我正在从 Ruby 转向 Objective-C,并且我一直在做:

NSObject *foo;

@property (nonatomic,retain) NSObject *foo;

在 .h 文件中,然后在 .m 文件中:

@synthesize foo;

在顶部和

[foo release]

在交易中。

只需 4 个步骤即可添加foo!经验丰富的 Objective-C 程序员是否每次想要向类添加新的实例变量时都手动执行所有四个步骤?我错过了使这个干燥的方法吗?

4

6 回答 6

6

这也是 C++ 中的一个常见问题(声明的加倍,尽管它确实有点不同)。简短的回答是,这就是语言的构造方式。它并没有真正违背 DRY,因为每个语句都是独一无二的并且有自己的目的。然而,按照今天的标准,它无疑是非常冗长的。

于 2009-07-31T21:52:09.233 回答
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
于 2010-09-27T04:12:07.483 回答
1

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

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

如果您的类通过属性公开了它们的大部分内部状态,您可能需要仔细查看它们的设计,以及是否可以通过移动职责来获得更简单的设计。

于 2009-08-01T01:02:34.960 回答
0

Objective-C 是 C 之上的一个非常薄的层。在低级别上,大多数“Objective”内容编译为注入 C 编译过程的代码指针。

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

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

保持你的对象小而专注,并且属性语法不应该是非常具有侵入性的。

于 2009-07-31T22:43:58.083 回答
0

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

self.foo = nil 

在我的交易中)

于 2009-07-31T22:51:23.780 回答
0

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

您可以使用脚本来消除一遍又一遍地键入相同变量样板的重复,但它仍然会存在于代码中。

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

于 2009-07-31T22:54:31.730 回答