Iphone 能否从UITableViewDataSource函数中访问应用程序委托?

Iphone 能否从UITableViewDataSource函数中访问应用程序委托?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我正在尝试了解iPhone的SQLite功能,但从重写的UITableViewDataSource函数读取数据库文件时遇到一些问题。我将数据库文件位置存储在我的应用程序委托的ivar中(作为NSString),但是,当我尝试从重写的UITableViewDataSource函数访问该字符串时,它会返回一些其他对象。如果我从任何一个类自己的实例方法访问该字符串,它就可以正常工作 是否有任何方法可以从重写的UITableViewDataSource函数中访问应用程序委托?该应用程序是一个维护对应用程

我正在尝试了解iPhone的SQLite功能,但从重写的UITableViewDataSource函数读取数据库文件时遇到一些问题。我将数据库文件位置存储在我的应用程序委托的ivar中(作为NSString),但是,当我尝试从重写的UITableViewDataSource函数访问该字符串时,它会返回一些其他对象。如果我从任何一个类自己的实例方法访问该字符串,它就可以正常工作


是否有任何方法可以从重写的UITableViewDataSource函数中访问应用程序委托?

该应用程序是一个维护对应用程序委托的引用的单例程序。您始终可以通过以下方式访问您的应用程序代理:

[UIApplication sharedApplication].delegate
您可能需要将返回转换为您自己的应用程序委托类,以消除警告。更好的是,编写一个访问器,返回您的upcast应用程序委托:

#pragma mark access to app delegate etc.
+ (MyAppDelegateClass*) sharedAppDelegate; {
    return (MyAppDelegateClass*)[[UIApplication sharedApplication] delegate];
}

这个问题原来很简单。我使用stringByAppendingPathComponent创建了NSString以保存数据库文件的路径:。我没有意识到这将被自动删除,所以我没有费心去明确地保留它。它返回不同类型的对象的原因是,一旦字符串被自动删除,内存就被重用了


显式保留保留数据库文件路径的字符串解决了问题。

Roger是正确的,但我个人发现在同一语句中混合点语法和括号语法非常混乱

如果这也让您感到困惑,那么仅使用括号表示法的等效语法是:

[[UIApplication sharedApplication] delegate];

是的,您可能需要将结果强制转换为您的应用程序委托类,而不是通用的UIApplicationDelegate类,否则您很可能会收到许多编译器警告。

虽然我不喜欢在AppDelegate中插入太多内容,但我通常需要访问它才能访问我应用程序中的其他单例,这使得方法调用+强制转换有点麻烦。因此,在我的大多数应用程序中,我会在全局头文件中定义一个快速宏

示例如下:


#define MY_DELEGATE (AppDelegate*)[[UIApplication sharedApplication] delegate]

参考
MY_DELEGATE
要容易得多

这很有用。但当我看到人们在事物前面加上“我的”前缀时,我的眼睛开始流血。我无法想象还有谁会拥有它……而且,我也不知道为什么您需要
AppDelegate
来访问Singleton。可以像
[[MyHowdyClass sharedHowdyer]someMethod]
一样访问单例。不需要
AppDelegate
。(1)如果它保存了任何面孔,我也鄙视标识符中的“我的”。为了便于说明,我写了“MY”来代替我的应用程序的首字母——我的实际上是“QM_DELEGATE”。你的“MyHowdyClass”也这样做了;)(2) 你完全正确,应该直接访问(设计模式)单例——我过于简化了;我应该说“shared instance”或其他什么来表示我的整个应用程序只使用一个实例的第三方类。它本身不是一个单身汉,但并不总是值得包装成一个单身汉。把它放在AppDelegate上以便于访问在这种情况下很方便。哈哈…明白了。[让我留下评论的额外文本]预处理不是最好的方法。@RogerNolan为什么预处理不是最好的方法?它仍然在做同样的事情,只是替换了文本。而预处理器只在编译时运行,因此用户不会感觉到任何性能差异。对此,没有任何疑问。要使其有用,您需要强制转换AppDelegate。是
sharedAppDelegate中的分号错误?不,这是有效的Objective-C