属性 – 在Objective-C中实现variables

好 ! 我对于声明variables和实现其属性的方式感到困惑。

.h文件的内容

@interface XYZAppDelegate : NSObject <UIApplicationDelegate> { } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet XYZViewController *viewController; @end 

.m文件内容

 #import "XYZAppDelegate.h" #import "XYZViewController.h" @implementation XYZAppDelegate @synthesize window=_window; @synthesize viewController=_viewController; 

我的问题/查询如下。

  • 如果我们放置财产,我们不需要声明variables吗? (使用属性,我们可以间接地声明variables – 是这样吗?)
  • 除此之外,还有哪些其他function? (在编码方面)
  • 为什么每个人都坚持在每个属性访问器之前使用_ (除安全威胁之外,它是否成为编码标准?背后的原因是什么?)

  • 你不必声明variables。 它是自动完成的,我相信由@synthesize。 声明它的一个好处是debugging器会自动列出它。 权衡这个冗余定义的丑陋。
  • 其他function:只读属性,分配(不保留)的值。
  • 下划线是一个约定,用于命名与属性和方法variables命名不同的成员variables。 苹果公司的样品有时使用这种惯例,有时不这样做。 我认为它通常是不必要的冗长,因为程序员可以轻松地分辨myVariable和self.myVariable之间的区别。

1)如果我们放置财产,我们不需要声明variables吗? (使用属性,我们可以间接地声明variables – 是这样吗?)

不需要。您不需要为相应的属性声明variables。 您需要使用@synthesize propertyName命令,它告诉编译器为您创build这些variables。

2)为什么每个人都坚持在每个属性访问者之前使用_ (除安全威胁之外,它是否成为编码标准?背后的原因是什么?)

大多数人(都是?)被memory management的噩梦刺痛了。 其中一些是由马虎/懒惰/零睡眠编码引起的。 使用@synthesize propertyName = _propertyName允许程序员立即知道下划线的variables对于类是私有的,并且是不存在的。 它可以防止您专门分配或复制对象以存储在属性中的问题,或者意外地将自动释放对象分配给伊娃。

考虑:

1)一个自动释放的对象被分配给一个不留下的伊娃。

 @synthesize propertyName; propertyName = [NSString stringWithFormat:@"I've just made %@", "a boo-boo."]; 

“propertyName”现在引用一个很快就不存在的对象,这会在路上一旦创buildEXEC_BAD_ACCESS错误(只要它再次被引用)。

2)保留对象被设置为保留属性。

 @synthesize propertyName; self.propertyName = [[NSString alloc] initWithFormat:@"I just created %@", @"a leak"] 

现在我们创build了一个NSString对象,并将其设置为propertyName属性,该属性本身保留了该variables。 现在对象被双重保留,不会被正确释放。

这两个问题都很容易解决(甚至在疲倦的时候,尽pipe不那么如此),当你用下划线正确命名你的ivars。 这不是一个防止欺骗的方法,但它使pipe理头脑中对象的保留计数变得相当容易。

(1)不,不具有新的64位唯一的function。 variables会自动为您声明。

(2)我不知道你在问什么。

(3)这只是一个约定,所以variables名称与访问者名称不同。 使你更清楚你正在处理。