34

方法1:

@interface MyController : UIViewController {
    UILabel *myText;
}

@property (nonatomic, strong) UILabel *myText;

方法2:

@interface MyController : UIViewController
@property (nonatomic, strong) UILabel *myText;

方法3:

@interface MyController : UIViewController {
    UILabel *myText;
}

我读过一些关于这类东西的文章,但我仍然没有真正意识到我必须采用哪种方法。

我还发现有人说方法 1 是一种旧方法,所以我想知道使用 ARC 的 ios sdk 6 的最佳实践。

我知道使用属性声明变量是生成 getter 和 setter 的一种简单方法,有人建议使用它。但是,我想问一下,如果一个变量不是由另一个类调用的,那么这个变量是否需要使用属性?并将其设置为接口内的私有变量?或者对于仅在接口内声明的变量更好?我想学习最佳实践,所以如果这是一个愚蠢的问题,请原谅我。

而且,有些开发者这样写@synthesize

@synthesize myText=_myText;

但有些人这样写:

@synthesize myText;

我也想知道区别,哪一个更可取?

非常感谢你!

4

2 回答 2

58

最现代的方式1

  • 尽可能声明属性
  • 不要单独声明 iVar 2
  • 不要@synthesize 3
  • 在您的 .h 文件中找到尽可能少的属性4
  • 在 .m 文件的类扩展中找到尽可能多的属性5

1 从 Xcode 4.5.2 开始。其中大部分适用于 4.4,其中一些无法在 4.2(Snow Leopard 下可用的最后一个版本)上编译。这是预处理器的东西,所以它至少与 iOS5 兼容(我没有在 iOS4 上测试过,但也应该没问题)。

2声明 iVar 和属性是没有意义。我敢肯定,在一些晦涩的情况下,您想声明 iVars而不是属性,但我想不出。

3 Xcode 将创建一个与属性同名的 iVar,前面有一个 _underscore。如果您(很少)需要其他类型的行为,您可以手动@synthesize property = someOtherName. @vikingosegundo 将我们链接到这篇关于动态 ivars的文章,这是@synthesize. @RobNapier 评论说,如果您正在为属性创建自己的 getter(只读)和 setter(读/写),您确实需要@synthesize iVar = _iVar(奇怪地),因为在这种情况下,预处理器不会为您生成 iVar。

4界面的一般规则:尽可能保持空白。如果它们是供私人使用的,那么您现在根本不需要声明您的方法。如果您可以在没有接口声明的情况下使代码工作,那就是要走的路。

5这是 .m 文件中的 @interface 块,位于 @implementation 上方:

#TestClass.m

@interface TestClass()

//private property declarations here

@end

@implementation TestClass
...
于 2013-01-09T14:01:04.547 回答
1

如果您喜欢@synthesized 属性的漂亮目录,您可能还想使用@synthesize,您可以参考和评论以便清晰和组织。

此外,@synthesize 允许您在属性上设置断点并在其值更改时捕获。

当编译器为你做所有事情时,你最终会远离真正发生的事情并且对它一无所知。但是,不必一直自己输入所有内容也很好。

于 2013-07-11T15:49:13.990 回答