属性-Objective-C中变量的实现



好吧!我对声明变量的方式感到困惑;实现其属性。

.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;

我的问题/疑问如下。

  • 如果我们放置属性,难道不需要声明变量吗?(使用属性,我们可以间接声明变量——是这样吗?)
  • 除此之外,还有哪些其他功能?(在特定编码中)
  • 为什么每个人都坚持在每个属性访问器之前使用_?(除了安全威胁?它已经成为编码标准了吗?它背后的原因是什么?)
  • 您无需申报变量它是自动完成的,我相信通过@synthesis。一宣布它的好处是调试器将自动列出它。权衡一下冗余定义
  • 其他功能:只读属性,已分配(未保留)的值
  • 下划线是命名成员变量名称不同于属性和方法变量。苹果的样品有时使用此约定有时不会。我认为通常作为程序员可以很容易地说出myVariable和self.myVariable

1)如果我们放置属性,难道不需要声明变量吗?(使用属性,我们可以间接声明变量-是这样吗?)

没有。不需要为相应的属性声明变量。您需要使用@synthesize propertyName命令,该命令告诉编译器为您创建这些变量。

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

大多数人(所有人?)都被记忆管理噩梦刺痛过。其中一些是由草率/懒惰/零睡眠编码引起的。使用@synthesize propertyName = _propertyName可以让程序员立即知道带下划线的变量对类是私有的,并且是不可保留的。它可以防止您专门分配或复制要存储在属性中的对象,或意外地将自动释放的对象分配给ivar的问题。

考虑:

1) 一个自动释放的对象被分配给一个未保留的ivar。

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

"propertyName"现在引用了一个很快就不存在的对象,这将在以后(一旦再次引用)创建EXEC_BAD_ACCESS错误。

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

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

现在,我们创建了一个NSString对象,并将其设置为propertyName属性,该属性本身保留了变量。现在,该对象被双重保留,无法正确释放。

当你用下划线正确地命名你的ivar时,这两个问题都很容易解决(即使在累的时候,尽管不那么累)。这不是一个愚蠢的方法,但它使管理头脑中对象的保留计数变得容易得多。

(1)没有,没有新的仅64位功能。这些变量是自动为您声明的。

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

(3) 这只是一种约定,因此变量名与访问器名不同。让你更清楚地知道你在处理什么。

最新更新