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

时间:2011-06-21 12:58:52

标签: objective-c ios

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

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

我的问题/查询如下。

  • 如果我们放置属性,我们不要求声明变量吗? (使用属性,我们可以间接声明变量 - 是这样的吗?)
  • 除此之外还有哪些其他功能? (具体编码)
  • 为什么每个人都坚持在每个属性访问者之前使用_? (除了安全威胁?它是否已成为编码标准?背后的原因是什么?)

3 个答案:

答案 0 :(得分:4)

  • 你不必申报 变量。它是自动完成的, 我相信@synthesize。一 声明它的优点是 调试器会自动列出它。 称这是对抗丑陋的 冗余定义。
  • 其他功能:只读属性, 已分配(未保留)的值。
  • 下划线是一种惯例 命名成员变量 不同于属性的名称和 方法变量。 Apple的样品 有时使用这个惯例和 有时不。我认为是 通常不必要地冗长 程序员可以轻松告诉 myVariable和。之间的区别 self.myVariable。

答案 1 :(得分:4)

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属性,该属性本身保留变量。现在该对象被双重保留,无法正确释放。

当您使用下划线正确命名您的ivars时,这两个问题都很容易打击(即使很累,尽管不那么)。这不是一种万无一失的方法,但它可以更容易地管理你脑中物体的保留数量。

答案 2 :(得分:2)

(1)不,不是新的64位功能。变量会自动为您声明。

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

(3)这只是一个约定,因此变量名称与访问者名称不同。使你处理的更清楚。