Objective C的实例变量,我为什么要声明它们?

时间:2011-06-24 12:32:13

标签: objective-c instance-variables

我很难理解为什么需要声明Instance Variables。让我解释一下我的意思..

例如..

@interface LearningViewController : UIViewController {
  UILabel *myText; // <--- Instance Variables
}

@property (nonatomic,retain) IBOutlet UILabel *myText;

-(IBAction)method:(id)sender;

@end

这也可以作为

完成
@interface LearningViewController : UIViewController {
  //instance variables go here, but are not declared, I just leave this field blank
}

@property (nonatomic,retain) IBOutlet UILabel *myText;

-(IBAction)method:(id)sender;

@end

正如你所看到的......在后一个例子中,我只为UILabel * myText构建了setter / getter

但在前者中我也声明了Instance Variables。

两人最终都在工作

@implementation LearningViewController

@synthesize myText;


-(IBAction)method:(id)sender {
  [myText setText:@"hey"];

  //or

  NSString *myObject = [[NSString alloc]initWithString:@"hey"];

  [myText setText:myObject];    
}

现在两件事都会产生相同的结果。所以我的问题是,为什么?无论采用哪种方式,有什么好处? 为什么我要构建和反对

NSString *myObject = [[NSString alloc]initWithString:@"hey"];

myText.text = myObject;

当我可以做的时候

[myText setText:@"hey"];

提前感谢。

5 个答案:

答案 0 :(得分:2)

此外,有时您希望在类中使用受保护的或私有的iVar,而不是从中创建属性。 (例如,当您不希望允许iVar访问除此类(私有)或其后代(受保护)的实例之外的任何内容。标头中声明的属性可用于任何可以“看到”该对象的对象。目标对象。从信息隐藏的角度来看,自动将标题中的ivars声明为属性(带或不带花括号内的声明)可能不好。

您还可以在.m文件中添加一个实现部分:您声明的任何属性都将是该类的私有属性。 (显然)的好处是在需要时实现信息隐藏,以及使用点符号的能力。

答案 1 :(得分:1)

最初Objective-C没有属性,@ synthesize不存在。您必须声明您的iVar(实例变量)并编写您自己的setter和getter。

当语言和运行时被修改为包含属性和@synthesize时,事情就更好了。你不再需要写你的二传手和吸气剂。但是你仍然必须声明你的iVar。

后来,语言和运行时进化得更多,今天,你甚至不需要声明你的iVar。 (虽然我倾向于编写@synthesize example = _example;所以我可以控制生成的iVar的名称。)

这是一项新功能,仅受相对较新版本的运行时支持。不支持低于4.x的iOS版本,以及旧版本的OSX。

如果您正在为今天和未来构建软件,请继续将它们排除在外,如果您需要传统支持,请将它们保留下来。

答案 2 :(得分:0)

正如您的代码所示,您在技术上不需要声明实例变量,大部分时间

一个关键的例外是你正在编译旧的(&lt; 4.0)iOS运行时,以及可能使用GCC的32位Mac OS X运行时,它不支持实例变量的合成。 / p>

此外,如果要为以后添加实例变量保留空间(如果要生成框架并希望稍后扩展类,则可能相关),您需要显式声明实例变量。

编辑:长话短说:遗留,可移植性和可扩展性问题禁止明确的ivars。对于以10.6为目标的应用程序,尤其是10.7,几乎不需要声明它们。

答案 3 :(得分:0)

在问题的第二部分,您只是使用点符号。您可以将myText.text设置为等于@“嘿”,就像您在第二个示例中所做的那样。

[myText setText:@"hey"]; 

的同义词
myText.text = @"hey";

您不需要声明NSString来提前保存您的值。

答案 4 :(得分:0)

你可以退出iVars,但我不同意遗漏iVars。 OOP中的.h文件通常是显示所有变量和方法的头文件。它声明了它们。假设将来你想看看这个类的功能,你只需要参考.h文件。或者假设其他人需要查看该类,或者使用该类与他的代码进行通信。它可以更容易地查看变量,查看声明的内容和不声明的内容。也就是说,如果你想专业编程。

现在它真的取决于你想做什么。您创建对象的原因是,您可以在以后释放它。所以你继续使用它,当你完成后你就完成了它的使用。现在,当在一个方法中使用它们时,为整个类创建实例变量并不是一个好的设计决策。在整个类存储变量的意义上它很差,而实际上它只用在一个方法中。在这种情况下,您应该只在该方法中创建该对象,并在完成后立即将其释放。

现在有时候正在做

[myText setText@"hello"];

的工作原理。这真的取决于你的代码。我想真正了解情况差异的唯一方法就是练习。有时您需要将标签设置为另一个对象,从而创建一个对象。否则,它会被自动释放等......

无论如何,基本上,仅将实例变量用于将要全局使用的变量。当然还有UI元素(因为它们被整个类和接口构建器使用)。

希望这有帮助。