这对于提出一个简单的问题还有很长的路要走,但考虑到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&更多地使用指针?
答案 0 :(得分:1)
是的,听起来你并不完全理解指针是如何工作的。我不是试图自己解释,而是指向你thorough chapter on pointers。
需要注意的一点是,在Objective-C中,您永远不会在堆栈 1 上分配对象。始终在堆上分配对象,并返回指针。 (如malloc()
。)这就是对象类型 2 中始终存在星号(*
)的原因。模型和控制器都有指向同一底层数组的指针。 self.alarms = [dataController allAlarms]
不复制数组,它复制指针 3 。
当你调用removeObjectAtIndex:
时,它不会改变指针的任何内容 - 指针只是一个数字 - 它取消引用指针并对内存中的底层对象进行操作。 / p>
1。有一个小例外,阻止
2。排除id
,typedef
'
3. 如果您做想要复制数组,请使用(copy)
属性而不是(retain)
。