【问题标题】:I want to understand when to use @property vs instance variables我想了解何时使用 @property 与实例变量
【发布时间】:2014-02-25 23:52:18
【问题描述】:

我学习 Obj-C 已经有一段时间了,我有一个基本问题。在我的代码中似乎到处都有大量的“自我”。我认为这归结为一个关于声明和使用变量的两种方式之间差异的基本问题。

附件是一些支持我的问题的代码。在其中,声明了两个变量(在不同的地方)并用于在方法中执行相同的操作:optionA 和 optionB。我不确定使用哪一个。我认为这可能是因为使用“属性”,如 optionB 所示,可以确保我获得访问器(setter 和 getter),但我看到 optionA 显然有一个 setter。

我更喜欢选项 A,因为这意味着我不需要到处都是“自我”,但我想了解使用其中一个而不是另一个的含义。

在我正在处理的程序中,所有变量都被声明为属性(下面的选项 B),但在访问它们时我必须使用“自我”。我想知道这是否正确,只是正确做事方式的产物,或者我是否完全不合时宜,应该使用另一种形式,比如 optionA。

何时/为什么有人会在接口的大括号之间声明一个变量(如 optionA)?

我搜索了已回答的问题,但没有找到任何能完全告诉我我想在这里学习什么的问题。但我在其他问题或他们的答案中找不到我正在寻找的信息。

我在这里有一张代码的图片(但显然我没有被允许将其直接链接到此消息中的声望点):http://i1127.photobucket.com/albums/l631/GenericImage/headerQueryOBJC.jpg

这里是列表:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {
    IBOutlet NSTextField *optionA;

}

- (IBAction)happy:(id)sender; 
@property (assign) IBOutlet NSWindow *window; 
@property (weak) IBOutlet NSTextField *optionB; 
@end 

实现

#import "AppDelegate.h" 

@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
     // Insert code here to initialize your application 
} 


-(IBAction)happy:(id)sender
{  
    [optionA setStringValue:@":-)"]; 
    [[self optionB] setStringValue:@":)"]; 
} 

@end 

【问题讨论】:

  • 感谢维京人!你是如何修复格式的?我不太明白我应该做什么......
  • 如果您只是选择所有代码行并点击编辑器中的代码按钮,它将为您格式化代码。 (您格式化代码的实际方法是在每行之前放置四个空格。但编辑器可以为您完成,所以这样的工作更少。)
  • 谢谢你,查克!下次我会尝试这种技术。我很困惑,尝试使用反引号和八个空格……但无济于事。

标签: objective-c cocoa properties ivar


【解决方案1】:

在很多场景中,属性的使用等价于变量的使用。

在您描述的场景中,您的变量和属性引用用户界面对象 (IBOutlet) 并链接到 Interface Builder,您看不到太大的区别,主要是因为您的变量将指向同一个对象在其所有者(或控制器,用苹果术语)的整个生命周期中

可能会影响场景的一些因素是:
- ARC的使用
- 属性修饰符(分配、复制...)
- 绑定

如果您使用 ARC,则更有可能看不清其中的区别。但是,当不使用 ARC 并且拥有带有“copy”或“assign”修饰符的属性时,您可以看到差异。

@property (retain) NSString *string;

string = someOtherString;

在此示例中,在分配 someOtherString 之前,与属性关联的 ivar 从其先前的内容中释放(并且其保留计数减少)。如果您不使用该属性,则需要在每次分配中自己处理保留计数,以避免写入已释放的内存。

另一个例子:如果您在项目中使用绑定,您会发现使用 ivars 是不够的,因为它们不符合 KVC/KVO。

结论:如果你理解了底层的概念,你就能知道propertiesvariables什么时候是等价的。

【讨论】:

  • 谢谢!随着我阅读越来越多与我的问题相关的回复(此处和网站周围),很明显我还没有“理解基本概念”,正如我所怀疑的那样,这是我的问题的一部分!我可能会删除这个问题...
  • 你的问题写得很好,所以我会留下它。
  • 就我的原始查询而言,上述示例是否足够健壮,可以使用 optionA 或 optionB? IE。我可以实现上面的 optionA 技术,而不用担心我正在养成一个坏习惯,或者远离 Apple 对该语言的预期用途吗?我还没有专业地编写程序,所以在游戏的这个阶段后果都是我自己的。我想做的一件事是复制我正在编写的更大的程序,实施更改,然后有两个版本可以用来比较和对比事情的进展。想法?
  • 对于您的具体示例,这两个选项都可以。不要太担心,我可以保证,如果您编写一些程序,您会更好地了解这些“基本概念”。
猜你喜欢
  • 2012-01-17
  • 2021-05-15
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2012-08-27
  • 1970-01-01
  • 2014-09-21
相关资源
最近更新 更多