混淆将Obj-C对象传递给方法并保留对该对象的更改

时间:2012-10-11 20:36:25

标签: objective-c multithreading pointers reference

我正在编写程序并尝试了解有关线程,多处理等的更多信息。

我的架构是模型/视图/控制器类型。

我有自己的NSImageView(ThumbnailView)的子类,我想要聪明一点,让它听一条消息来清除自己(因此所有的缩略图只是清除自己,而不必循环遍历它们)。

问题是我的ThumbnailViewThumbnailViewController控制,它实际上是监听消息的人。当它获得消息时,它会旋转一个带有类对象的新线程,该对象就是命令(ClearThumbnailViewCommand)。它将包含关联的ThumbnailView对象和密钥的字典项作为参数传递。在ClearThumbnailViewCommand范围内,我将ThumbnailView对象的图像设置为中性图像(如gray.jpg)。

所有这一切都正常,但是,更改的Thumbnail对象与进入的Thumbnail对象不同。所以我想我需要传递指针而不是对象。我记得有关使用MyObject**而不是MyObject*并通过&MyObject传递的内容,但我似乎无法解开各种组合。我无法推理出来,我回到了我通常的万无一失的尝试随机组合的系统,但这次它没有帮助。

似乎即使我能够构造一个传递指针的类(不确定我是否正确使用这些术语),我也无法将其正确地分配给NSDictionary,它不需要id**

如果有帮助的话,我会尝试在下面添加基础知识。


ThumbnailVew : NSImageView {
    ThumbnailVewController  * _controller;
}

init  {
    _controller = [[ControllerClass alloc] initWithControlObject: &self];
}

ThumbnailVewController : ControllerClass {
    id  ** _controlObject;
}

initWithControlObject: (id**)object {
    _controlObject = object;
}

然后在发布消息时调用ThumbnailVewController方法,最终执行此操作... 当然,这不会让我通过&_controlObject

当它全部重写以便我可以通过_controlObject时,我不会收到错误,但是我更改的ThumbnailView只是方法的本地。

if([command isEqualToString:@"CLEAR_THUMBNAILS"]) {
    NSDictionary * dict;
    dict = [[NSDictionary alloc] initWithObjectsAndKeys: &_controlObject, @"thumbnail", nil];

    [self newThreadWithCommand:[[[ClearThumbnailViewCommand alloc] initWithArgument:dict] autorelease]];
}

这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

感谢您的反馈。我确实只是想探索一些不同的情况。我知道我可能会想办法解决一些事情,但这确实有助于我更清楚地理解界限。

如果它可以帮助其他任何人,我找到了解决我的特定问题的方法。事实证明我在ThumbnailView的init阶段中引用了_controlObject。在该阶段创建的对象与调用awakeFromNib时创建的ThumbnailView对象不同。

当我将_controlObject赋值移动到awakeFromNib方法时,所有工作都按预期工作。 (当然,我将代码重置为不包含任何花哨的**和&声明。

再次感谢您帮助我更多地了解这种语言。我开始喜欢它了。