我一直在学习Obj-C一段时间了,我有一个基本的问题。在我的代码中,似乎有无数的“自我”。我认为这是关于两种声明和使用变量的方法之间差异的基本问题。
附件是一些支持我的问题的代码。在其中,声明了两个变量(在不同的地方)并用于在方法中执行相同的操作:optionA和optionB。我不确定使用哪一个。我认为这可能是因为使用“属性”,如optionB所示,将确保我获得访问器(setter和getter),但我看到optionA显然有一个setter。
我更喜欢optionA,因为这意味着我不需要在整个地方使用“自我”,但我想了解使用其中一种的含义。
在我正在处理的程序中,所有变量都被声明为属性(下面是一个la optionB),但在访问它时我必须使用'self'。我想知道这是否合适,只是正确做事的工件,或者我是否完全脱离了标记,应该使用另一种形式,如选项A的形式。
何时/为什么有人在界面的花括号之间声明变量(如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
答案 0 :(得分:1)
在许多情况下,使用属性等同于使用变量。
在您描述的场景中,您的变量&amp;属性是指用户界面对象(IBOutlet)并且链接到Interface Builder,您没有看到那么多差异,主要是因为您的变量将在其所有者(或控制器)的整个生命周期中指向同一对象苹果的行话)
可能影响该情景的一些事情是:
- 使用ARC
- 属性修饰符(赋值,复制......)
- 绑定
如果你使用ARC,你很可能没有清楚地看到差异。但是当不使用ARC时,使用带有'copy'或'assign'修饰符的属性可以让你看到差异。
@property (retain) NSString *string;
string = someOtherString;
在此示例中,在分配someOtherString之前,与属性关联的ivar将从其先前的内容中释放(并且其保留计数将减少)。如果您没有使用该属性,则需要在每个赋值中自行处理retaountount,以避免在已释放的内存上进行写入。
另一个例子:如果你在项目中使用绑定,你会发现使用ivars是不够的,因为它们不符合KVC / KVO。
结论:如果您了解基本概念,您将能够知道属性和变量何时相同。