奇怪的NSString行为“警告:无法读取......的符号”

时间:2011-05-27 19:13:46

标签: iphone objective-c xcode nsstring

我有一个处理数据库操作的对象。它始于:

-(id)init{
    databaseName = @"WhoPaidLast.sql";

    // I think this one gets it from the app whereas the next one gets it from the phone
    // databasePath = [[NSBundle mainBundle] pathForResource:@"WhoPaidLast" ofType:@"sql"];

    // Get the path to the documents directory and append the databaseName
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    self.databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    // Execute the "checkAndCreateDatabase" function
    [self checkAndCreateDatabase];

    return self;

在这结束时,我检查db:

-(void) checkAndCreateDatabase{
    // Check if the SQL database has already been saved to the users phone, if not then copy it over
    BOOL success;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    success = [fileManager fileExistsAtPath:self.databasePath];

    // If the database already exists then return without doing anything
    if(success) return;

    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil];

    //[fileManager release];
}

在此之后,当我使用databasePath时,我似乎只能在它抛出此错误之前使用它一次:

warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.1 (8G4)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).

我有一个从数据库返回一堆值的函数。第一次使用detabasePath它工作正常并输出预期值,第二次抛出上述错误。

以下是该功能的开头:

// Setup the database object
    sqlite3 *database;

    // Init groupsArray
    groupsArray = [[NSMutableArray alloc] init];


     NSLog(@"r- %@",self.databasePath);
     NSLog(@"s- %@",self.databasePath);
    // Open the database from the users filessytem
    if(sqlite3_open([self.databasePath UTF8String], &database) == SQLITE_OK) {

如果我删除了第二个NSLog函数,那么下次使用databasePath时它会出错。如果我删除它们,它将适用于sqlite3_open函数,但在下次使用时会出错。

如果有人知道我的错误来源和/或我可能做错了什么,我非常感谢你的帮助。

感谢。

2 个答案:

答案 0 :(得分:0)

上述代码中存在许多与内存管理相关的错误。我猜你所看到的调试器错误是由于与内存相关的崩溃导致调试器无法锁定以便为您提供堆栈跟踪。

首先,你的-init方法永远不会在超类上调用它,这是不对的。你需要像

这样的东西
if (!(self = [super init]))
{
    return nil;
}

在该方法的开头。

仅此一项就会导致各种有趣的崩溃。除此之外,请确保databasePath属性设置为使用copyretain(最好是copy,因为它是NSString),或者它不会保留到[documentsDir stringByAppendingPathComponent:databaseName]返回的自动释放对象。

此外,我知道你已将其注释掉,但请勿使用[fileManager release]。这是你从[NSFileManager defaultManager]回来的共享实例,而你没有保留它,所以释放它会导致坏事。

您可以尝试启用断点并打开NSZombie以找到您的特定崩溃位置,但我敢打赌原因是我在上面列出的因素之一。

答案 1 :(得分:0)

这是iOS / Xcode 4的错误

在终端

中输入以下2个命令
cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.1\ \(8G4\)/Symbols/

sudo ln -s /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/Developer/ Developer

在运行之前清理(shift + cmd + k)项目。问题应该解决了。

参考:http://blog.damore.it/2011/04/xcode4-debugging-problem-warning-unable.html