iOS Objective-C访问来自不同类的ivars

时间:2011-05-31 09:32:45

标签: objective-c cocoa-touch ios instance-variables

从不同的类访问ivars的首选方法是什么?

应用代表类

假设我想从另一个UIViewController类的Application Delegate类访问根控制器(@synthesized as rootController)。我在某处读过您从Application Delegate类访问ivars的方式与访问其他ivars的方式不同。

常规课程

如果我想从另一个UIViewController类中访问一些ivars。我想在类 A 中访问包含名称列表(NSArray)名称(名称为@synthesized)的ivar,并从 B 类访问它们。

ivars具有默认访问权限(受保护)。

也许你可以给我一个很好的教程,解释如何访问ivars。

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你将需要牢固掌握模型 - 视图 - 控制器模式(顺便说一下,它在iOS中无处不在)。

基本上,你应该区分你的视图和你的控制器 - 这在iOS中非常“自然”,因为它是由框架强制实施的 - 而且也是在控制器/视图和你的模型之间,这是你拥有数据的地方,在您的情况下名称列表。控制器访问模型并对其进行修改,并通过视图调解对模型的访问。

模型应该在某种程度上被考虑 - 比如,在它自己的类中 - 以便允许模块化和低依赖性。在一个特定的设计中(并不意味着它是最好的或更适合你),模型可以是一个单例,以便您可以从其他对象轻松访问它。

您将理解,必须正确设计一个有效的模型,但这是可行的方法。

检查this tutorial以及此S.O. topic

答案 1 :(得分:1)

应用程序委托是一个单例,因此您可以从任何地方访问这些属性。

在“普通”类的情况下,假设您不想将其设为单例,通常会使用委托模式。这意味着类A成为类B的委托,类B可以调用类A将实现的方法,这就是UITableViews如何使用DataSource委托。

这只适用于你只需要从另一个类访问这些属性(委托不支持多代表而没有一点hackery),否则我会将你的数据封装在任何类都可以访问的模型中。 / p>

答案 2 :(得分:0)

我认为您需要的概念是声明的属性:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17

您似乎已经在使用它(使用@synthesize)。

ivars需要从课堂外部访问getter和setter。通过使用属性,可以使用@synthesized自动实现这些getter / setter。

对于应用程序委托,我不明白:你想通过应用程序委托从UIViewController访问另一个控制器吗?