Objective c 将Obj-C对象传递到方法并保留对该对象的更改会造成混淆

Objective c 将Obj-C对象传递到方法并保留对该对象的更改会造成混淆,objective-c,multithreading,pointers,reference,Objective C,Multithreading,Pointers,Reference,我正在编写一个程序,并试图学习更多关于线程、多处理等方面的知识 我的架构是模型/视图/控制器类型 我有自己的NSImageView(ThumbnailView)子类,我想变得聪明一些,让它监听消息以清除自身(因此所有的缩略图都会自动清除,而无需我循环) 问题是我的ThumbnailView是由一个ThumbnailViewController控制的,该控制器实际上是在监听消息。当它收到消息时,它将派生一个新线程,该线程带有一个类对象,该类对象是命令(ClearThumbnailViewComma

我正在编写一个程序,并试图学习更多关于线程、多处理等方面的知识

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

我有自己的
NSImageView
(ThumbnailView)子类,我想变得聪明一些,让它监听消息以清除自身(因此所有的缩略图都会自动清除,而无需我循环)

问题是我的
ThumbnailView
是由一个
ThumbnailViewController
控制的,该控制器实际上是在监听消息。当它收到消息时,它将派生一个新线程,该线程带有一个类对象,该类对象是命令(
ClearThumbnailViewCommand
)。它将包含关联的
ThumbnailView
对象和键的字典项作为参数传递。在
ClearThumbnailViewCommand
中,我将
ThumbnailView
对象的图像设置为一些中性图像(如gray.jpg)

所有这些都很好,但是,更改的缩略图对象与进入的缩略图对象不同。所以我想我需要传递一个指针而不是对象。我记得一些关于使用
MyObject**
而不是
MyObject*
和通过
&MyObject
传递的信息,但我似乎无法解开各种组合。由于无法推理,我又回到了我的,通常情况下,万无一失的系统,尝试随机组合的东西,但这一次它没有帮助

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

如果有帮助的话,我将尝试包括以下基本内容




然后,当消息发布时,会调用
ThumbnailVewController
方法,该方法最终会执行此操作… 当然,这不会让我传入
&\u controlObject

当全部重写以便我可以传递
\u controlObject
时,我没有得到错误,但是
缩略图视图
的更改只是该方法的局部更改

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

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

这可能吗

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

为了防止对其他人有帮助,我找到了解决我的问题的方法。事实证明,我在ThumbnailView的初始化阶段引用了_controlObject。在该阶段创建的对象与调用awakeFromNib时创建的ThumbnailView对象不同

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


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

我建议在尝试解开C语言和指针在Objective-C中的用法之前,先阅读有关C语言和指针的教程;否则可能会有点混乱。FYI
\u controlObject
被声明为三指针。
id
已经是指向Objective-C对象的指针。虽然听起来您的目标之一是探索一些Objective-C概念,但解决方案似乎比需要的更复杂。第一个线索是视图(
ThumbnailView
)保留对其控制器的引用。清除多个
ThumbnailView
对象而不显式循环它们的另一个解决方案是
NSNotification
,其中所有实例都将观察特定通知。
ThumbnailVewController : ControllerClass {
    id  ** _controlObject;
}

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

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