NSMutableArray和指针:对指针的操作是对原始数组的操作(?)

时间:2011-06-02 22:17:35

标签: ios uitableview pointers nsmutablearray datasource

这对于提出一个简单的问题还有很长的路要走,但考虑到Objective-C中有些令人困惑的指针,可能会验证这里发生的事情会对其他人以及我自己有所帮助。

因此,简而言之,我有一个UITableView,您可以启用编辑和删除行。我想删除表视图中的行和数据源。原始数据源在模型类中,但我有一个指针/属性,包含我本地表视图控制器中的数据。当我通过编辑从表视图中删除一行时,它似乎工作并删除数据...但我不明白为什么。我认为这是因为我对指针的基本误解。

在我的带有NSMutableArray的模型类中:

@property (nonatomic,retain) NSMutableArray *allAlarms;
// ... plist gets read and serialized to an array ...
allAlarms = [NSMutableArray arrayWithArray:[plistValues objectForKey:@"Alarms"]];

在UITableViewController类中,我在viewWillAppear期间通过属性拉出了这个可变数组:

@property (nonatomic, retain) NSMutableArray *alarms;

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // retrieve values from data controller
    self.alarms = [dataController returnAllAlarms];
    [self.tableView reloadData];
}

当执行编辑的委托方法时,我这样做,并且它有效......

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the row from the local data source
    [self.alarms removeObjectAtIndex:indexPath.row]; 
    // The above line appears to delete it in the local pointer as well as in the original property in the model class
    // so I just have to tell the data controller to save plist for when it's read back in via viewWillAppear
    [dataController writePlist];
    // Delete the row from the table view
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}   

}

为什么我的tableView中发生了什么:commitEditingStyle:forRowAtIndexPath最终有效?从我的本地类中的NSMutableArray指针中删除项目是否也将其删除在远程类中的原始指针中,因为前者是指向后者的指针?

我需要理解,因为我将在这个本地指针上执行其他操作,并且想要确保我不想在远程属性上执行它等多余,等等。我做的不直观,多余,或者在我继续学习Objective-C&更多地使用指针?

1 个答案:

答案 0 :(得分:1)

是的,听起来你并不完全理解指针是如何工作的。我不是试图自己解释,而是指向你thorough chapter on pointers

需要注意的一点是,在Objective-C中,您永远不会在堆栈 1 上分配对象。始终在堆上分配对象,并返回指针。 (如malloc()。)这就是对象类型 2 中始终存在星号(*)的原因。模型和控制器都有指向同一底层数组的指针。 self.alarms = [dataController allAlarms]不复制数组,它复制指针 3

当你调用removeObjectAtIndex:时,它不会改变指针的任何内容 - 指针只是一个数字 - 它取消引用指针并对内存中的底层对象进行操作。 / p>

1。有一个小例外,阻止 2。排除idtypedef' 3. 如果您想要复制数组,请使用(copy)属性而不是(retain)