我很难理解为什么需要声明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"];
提前感谢。
答案 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元素(因为它们被整个类和接口构建器使用)。
希望这有帮助。