Iphone iAction中AppDelegate addObject中的NSMutableArray

Iphone iAction中AppDelegate addObject中的NSMutableArray,iphone,arrays,nsmutablearray,Iphone,Arrays,Nsmutablearray,我一直在尝试在我的应用程序中添加一个简单的书签工具,以完成我在大学的毕业论文。我是iPhone开发新手,所以我真的不明白发生了什么 我想做的是向数组中添加一个对象字符串,但我所做的根本不起作用 我在AppDelegate中设置了数组,它填充BookmarksViewController.m文件中的表视图 我的应用程序由一个选项卡栏和导航栏组成,但为了便于阅读,我在这里删去了所有内容 代码如下: 设置阵列 学位论文AppDelegate.h 用数组填充表视图 BookmarksViewContro

我一直在尝试在我的应用程序中添加一个简单的书签工具,以完成我在大学的毕业论文。我是iPhone开发新手,所以我真的不明白发生了什么

我想做的是向数组中添加一个对象字符串,但我所做的根本不起作用

我在AppDelegate中设置了数组,它填充BookmarksViewController.m文件中的表视图

我的应用程序由一个选项卡栏和导航栏组成,但为了便于阅读,我在这里删去了所有内容

代码如下:

设置阵列

学位论文AppDelegate.h

用数组填充表视图

BookmarksViewController.h

BookmarksViewController.m

从另一个视图控制器执行iAction

头文件

实现文件

好的。。。。因此,当您按下按钮时,我希望它添加到app委托中的数组中,并将BookmarksViewController推到导航堆栈上,然后更新表。除了将对象添加到数组之外,它执行所有操作

如果有人知道出了什么问题,你能帮我吗。我将非常感激


谢谢

您是否意识到每次调用iAction时您都在创建一个新的数组对象,保留它两次而不释放它

这将造成内存泄漏,但更重要的是,它将使用新阵列替换整个阵列,每次您只想添加一些内容时,都不会释放旧阵列。实际上,您并没有添加任何内容,而是创建了一个包含一个对象的数组

操作方法对于初始化数组之类的东西来说是一个不好的地方。将init代码移动到ApplicationIDFinishLaunching方法或其他合理的位置,并且在使用保留访问器将其分配给属性后不要忘记释放它

编辑:您实际上是在ApplicationIDFinishLaunching中执行init操作,但是您没有将结果数组分配给appdelegates属性,结果会丢失。将其分配给您的属性并删除iAction中的分配,这应该会有所帮助

Edit2:我的错又来了,你实际上是在把数组分配给你的ivar,而不是使用访问器。 如果数组的前几个元素显示正确,并且在按下按钮后它们仍保留在tableview中,则不会调用iAction Propaly或不会重新加载tableview。您的代码实际上应该删除所有条目,并用一个新条目替换它们。将NSLog放入iAction以检查是否正在调用它,如果没有,请检查您的连接。如果是,请检查tableview是否实际正在重新加载

Edit3回应您的评论:在添加新字符串之后,尝试将以下行添加到iAction中..:

NSLog(@"The array contains %i objects.", [[appDelegate array] count]);
这将向控制台输出数组包含的对象数量——如果是,并且如果每次按下按钮时该数量都增加,则表重新加载数据时出现问题。 我怀疑您将数据传输到bookmarksviewcontroller的方式可能是您的问题的原因-您正在将appdelegates数组内容从磁盘仅在ViewDiLoad中加载到bookmarksarray中。如果不再次调用viewdidload,则bookmarksarray中的数据也不会刷新。尝试在ViewWillDisplay中重新读取文件,或者在tableview重新加载之前调用其他方法。我强烈建议您找到另一种存储数据的方法—您的方法容易出现各种错误。尝试进入NSUserOrder核心数据。 但是,出于测试目的,请尝试更换此线路

cell.textLabel.text = [bookmarksArray objectAtIndex:indexPath.row];
在你的牢房里。。。使用以下代码进行编码:

DissertationAppDelegate *appDelegate = (DissertationAppDelegate *)[[UIApplication sharedApplication] delegate];
[[cell textLabel] setText:[[appDelegate array] objectAtIndex:indexPath.row]];
让我知道会发生什么。

在PushChap01书签中,您可以执行以下操作:

appDelegate.array = [[NSMutableArray alloc] init];
它在appDelegate中重新创建数组,使其再次具有0项。 相反,仅当它为零时才执行:

DissertationAppDelegate *appDelegate = (DissertationAppDelegate *)[[UIApplication sharedApplication] delegate];
if(appDelegate.array == nil) {
    appDelegate.array = [[NSMutableArray alloc] init];
}
[appDelegate.array addObject:@"THIS IS WHAT I WANT TO ADD"];
//here save that appDelegate.array to file
[appDelegate saveArray];
还可以创建新的saveArray方法。您可以在其他地方再次使用该方法将该数组保存到文件:

- (void)saveArray {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *fullFileName = [NSString stringWithFormat:@"%@/arraySaveFile", documentsDirectory];
    [self.array writeToFile:fullFileName atomically:NO];
}

好的,我已经看到我在那里所做的了。我已经从IBAction中删除了初始化。它现在仅从ApplicationIDFinishLaunching初始化。当按下按钮时,仍然没有向数组中添加任何内容。有什么建议吗?谢谢。你能不能把我的密码改一下,让它能做到这一点?我自己没有写任何东西,我只是复制了它,所以我完全不确定如何将它分配给属性。谢谢。是的,IBAction确实有效,它会更改BookmarksViewController的标题。我在那里有NSLogs,所以我知道正在调用iAction。谢谢。数组的前三个元素确实显示正确,只是我似乎无法添加任何内容。我在操作中添加了新的NSLogs,当您按下按钮时,它肯定会执行。
NSLog(@"The array contains %i objects.", [[appDelegate array] count]);
cell.textLabel.text = [bookmarksArray objectAtIndex:indexPath.row];
DissertationAppDelegate *appDelegate = (DissertationAppDelegate *)[[UIApplication sharedApplication] delegate];
[[cell textLabel] setText:[[appDelegate array] objectAtIndex:indexPath.row]];
appDelegate.array = [[NSMutableArray alloc] init];
DissertationAppDelegate *appDelegate = (DissertationAppDelegate *)[[UIApplication sharedApplication] delegate];
if(appDelegate.array == nil) {
    appDelegate.array = [[NSMutableArray alloc] init];
}
[appDelegate.array addObject:@"THIS IS WHAT I WANT TO ADD"];
//here save that appDelegate.array to file
[appDelegate saveArray];
- (void)saveArray {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *fullFileName = [NSString stringWithFormat:@"%@/arraySaveFile", documentsDirectory];
    [self.array writeToFile:fullFileName atomically:NO];
}