访问其他类/对象中的方法和变量(对象btw在哪里)?

时间:2011-05-13 15:03:01

标签: iphone objective-c object encapsulation

好的,我是Objective-C / iPhone编程的新手,所以当我尝试做一些在C ++中很容易的事情时会出现一些问题。

我正在构建一个基于标签栏的iPhone应用程序,其中包含三个视图,每个标签栏按钮一个。在第一个视图中,用户构建一个NSdictionary,第二个视图将显示为图形。要访问这个字典,我将它保存到第一个视图控制器中的.plist,然后在第二个视图控制器中从这个.plist中建立一个新字典。

要制作图表视图,我使用s7graphview,它在SecondViewController中初始化等,但有自己的.h和.m文件,我导入。将值加载到图形(来自创建的字典)中的方法在GraphInfoList.m文件中实现,这意味着我必须从.plist创建另一个字典来访问数据。如何访问已创建的字典?

在执行此操作时,我还创建了一个方法“dataFilePath”,它返回.plist的文件路径,我用它将数据加载到字典中。我找不到实现此方法的其他方法,而不是将其复制/粘贴到使用它的每个.m文件!还有另一种方式吗?

我有一段时间了:iPhone编程中的对象在哪里? .m文件是类,不是吗?我从不使用new运算符创建一个新对象,我想如果我有任何对象要调用我可以访问这些方法(如[FirstViewController dataFilePath])。

我真的不知道如何在Obj-C / Cocoa中处理这个问题,我不知道该搜索什么来找到答案。非常感谢帮助。

4 个答案:

答案 0 :(得分:1)

对象是类的实例(.m文件)。您使用new运算符分配/初始化一个新对象,就像在java中一样。您可以导入要使用/有权访问的类的.h,然后使用类似

的内容
MyClass *objectInstance = [[MyClass alloc] init]; 

创建一个实例。

就dataFilePath方法而言......你可以在应用程序的委托(可能是像MyAppNameAppDelegate.m这样的东西)中找到它,这是一个单例(整个应用程序的一个实例)。然后,您可以使用以下方式获取文件路径:

myFilePath = [[[UIApplication sharedApplication] delegate] dataFilePath];

我建议查看一本开头的Objective-c书以获取更多信息。我建议Learn Objective-C on the Mac。另外,我将看一下面向对象编程的基本介绍,因为看起来这就是绊倒你的东西。祝你好运。

答案 1 :(得分:0)

我在不同的视图控制器中使用s7graphview时遇到了同样的问题。我通过在AppDelegate中添加一个NSDictionary作为属性来解决它,当viewwilldisappear方法触发时,我添加了这段代码:

[((MyAppDelegate*) [[UIApplication sharedApplication] delegate]) setDictionary:self.dictionary];

我认为这不是唯一的方法,但你会删除减慢app的.plist代码

答案 2 :(得分:0)

您的应用代表是分享内容的好地方。您可以在应用程序代理中保留数据文件路径功能并访问它

path = [[[UIApplication sharedApplication] delegate] dataFilePath];

别忘了#import“YourAppDelegate.h”文件。

.m文件类似于.cpp文件或.c文件。基本上是实现文件。

答案 3 :(得分:0)

使用NSDictionary是正确域名对象的不良替代品,在玩杂耍时会遇到问题。通常,对象不是建模数据的最佳方式,例如NSNumber这样的数字很麻烦。

而是引入适当的域类。让标签栏中的两个via控制器都可以访问同一个对象没有问题,您可以轻松地使用viewWillAppear:方法将状态从一个视图更新到另一个视图。

甚至有时候你想要一个单身人士。如果任何对象只能有一个逻辑实例,那么单例是可行的方法。不要害怕他们。通常,正如Apple在其框架中使用的懒惰模式是您想要的。例如,这个界面:

@interface MyDomainManager : NSObject { /* ivars here */ }

+(MyDomainManager*)sharedManager;

// More proper tie and method here    

@end

然后是这样的实现:

@implementation MyDomainManager

+(MyDomainManager*)sharedManager;
{
    static MyDomainManager* manager = nil;
    if (manager == nil) {
        manager = [[self alloc] init];
    }
    return manager;
}

// More implementation cruft…

@end

从简单开始,因为这是一个好的开始,然后从那里开始构建。