2

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

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

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

在我正在处理的程序中,所有变量都被声明为属性(下面的选项B),但是在访问它们时我必须使用'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 
4

1 回答 1

1

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

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

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

如果您使用 ARC,则更有可能看不清楚差异。但是当不使用 ARC 并且拥有带有“复制”或“分配”修饰符的属性时,您可以看到差异。

@property (retain) NSString *string;

string = someOtherString;

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

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

结论:如果您了解基本概念,您将能够知道属性变量何时是等价的。

于 2014-02-26T00:14:54.573 回答