我想了解何时使用@property而不是实例变量

3
我已经学了一段时间的Obj-C,有一个基本问题。我的代码中似乎到处都是大量的“self”。我认为这是关于声明和使用变量两种方式之间差异的基本问题。
附上一些支持我的问题的代码。其中,在一个方法中声明了两个变量(在不同的位置),并用来做相同的事情:optionA和optionB。我不确定该使用哪一个。我认为可能是因为使用“property”,如optionB所示,可以确保我得到访问器(setter和getter),但我看到optionA显然也有一个setter。
我更喜欢optionA,因为这意味着我不需要在所有地方使用“self”,但我想了解使用一个而不是另一个的影响。
在我正在工作的程序中,所有变量都被声明为属性(类似于下面的optionB),但我必须在访问它们时使用“self”。我想知道这是否正确,只是正确方式的产物,还是我完全错了,应该使用另一种形式,如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 

谢谢,维京!你是怎么修复格式的?我不太明白我应该做什么... - ObjCLearner
1
如果你只是选择所有的代码行并在编辑器中点击代码按钮,它会为你格式化代码。(实际上,你要像这样格式化代码是在每一行之前放置四个空格。但编辑器可以为你完成,所以这样做更省事。) - Chuck
谢谢你,Chuck!下次我会尝试那个技巧。我之前很困惑,试着使用反引号和八个空格……但都没有成功。 - ObjCLearner
1个回答

1
有许多情况下,使用属性与使用变量是等价的。
在您描述的场景中,变量和属性都指向用户界面对象(IBOutlet)并链接到Interface Builder时,您不会看到太大的区别,主要是因为变量将在其所有者(或控制器,在苹果的术语中)的生命周期内指向同一对象。
影响场景的一些因素包括:
- 使用ARC
- 属性修饰符(assign、copy...)
- 绑定
如果使用ARC,则更有可能看不清差异。但是,当不使用ARC并且具有“copy”或“assign”修饰符的属性时,您可以看到差异。
@property (retain) NSString *string;

string = someOtherString;

在这个例子中,在分配someOtherString之前,与该属性相关的实例变量会释放其先前的内容(并且其保留计数会减少)。如果您没有使用该属性,则需要在每次赋值时自己处理保留计数,以避免写入已释放的内存。
另一个例子:如果您在项目中使用绑定,您会发现仅使用实例变量是不够的,因为它们不符合KVC / KVO。
结论:如果您理解底层概念,就能知道何时属性和变量是等效的。

谢谢!随着我阅读越来越多与我的问题相关的回答(在这里和整个网站上),很明显我还没有“理解基本概念”。这正是我怀疑的问题的一部分!也许我会删除这个问题... - ObjCLearner
你的问题写得很好,我会保留它。 - Merlevede
对于我的原始查询目的来说,上面的示例是否足够稳健,可以使用optionA或optionB?也就是说,我可以在不担心养成坏习惯或偏离苹果对该语言的预期使用的情况下实施上述optionA技术吗?我目前还不是专业程序员,所以后果完全由我自己承担。我想做的一件事是复制我正在编写的较大程序,实施更改,然后拥有两个版本,以便在事情向前发展时进行比较和对比。你有什么想法? - ObjCLearner
对于你的具体例子,两个选项都可以。不要太担心,我可以保证,如果你写几个程序,你会更好地理解这些“基本概念”。 - Merlevede

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接