【问题标题】:Property - Implementation of variables in Objective-C属性 - Objective-C 中变量的实现
【发布时间】:2011-06-21 12:58:51
【问题描述】:

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

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

我的问题/查询如下。

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

【问题讨论】:

  • @Abizern - 感谢您的标签编辑。这将有助于我发布新内容。

标签: objective-c ios


【解决方案1】:
  • 您不必声明 多变的。它是自动完成的, 我相信@synthesize。一 宣布它的好处是 调试器会自动列出它。 权衡这与丑陋 冗余定义。
  • 其他功能:只读属性, 分配(未保留)的值。
  • 下划线是一个约定 命名成员变量是 与属性不同的名称和 方法变量。苹果的样品 有时使用这个约定和 有时不。我认为它是 通常不必要地冗长 程序员可以很容易地告诉 myVariable 和 self.myVariable。

【讨论】:

    【解决方案2】:

    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 时,这两个问题都很容易解决(即使在疲倦时,尽管不那么累)。这不是一个万无一失的方法,但它可以让您更轻松地管理您头脑中的对象的保留计数。

    【讨论】:

    • 哇!第二个问题的解释很好。
    • 在 Find / Replace 中使用下划线进行调试和查找访问器使用的具体情况非常安全
    【解决方案3】:

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

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

    (3) 这只是一个约定,所以变量名与访问者名不同。让您更清楚您正在处理的问题。

    【讨论】:

    • 2) XCode4 中类似的附加功能 - 编码相关的新功能。 (问题是 XCode4 特定的)
    猜你喜欢
    • 2010-12-05
    • 2012-02-02
    • 1970-01-01
    • 2010-10-25
    • 2013-05-19
    • 2013-02-02
    • 2023-04-04
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多