用指针填充的 NSMutableArray

Posted

技术标签:

【中文标题】用指针填充的 NSMutableArray【英文标题】:NSMutableArray filled with pointers 【发布时间】:2010-06-07 12:53:14 【问题描述】:

我知道这个问题过去已经被问过了,但我真的很困惑,无法摆脱它。

我有 9 个指向 IB 对象的指针,声明如下:

IBOutlet UIButton *but1;

IBOutlet UIButton *but2;

....

NSMutableArray *buttons;

声明的属性:

@property (nonatomic,retain) IBOutlet UIButton *but1;

@property .....

在 IB 中,我已经建立了从按钮到指针的连接。

我现在需要用这些指针填充数组按钮以运行 UIButton 方法,例如

[[buttons objectWithId:0] setImage:[UIImage imageNamed:@"image1.png"]];

我知道我不能用指针填充数组,有没有办法让 IBOutlets 进入数组?

【问题讨论】:

已解决:我在initNibWithName下添加对象,改为viewDidLoad,可能按钮还没有初始化 【参考方案1】:

你不能用任意指针填充 Cocoa 容器,但是指向类类型对象的指针——比如你的 UIButtons——就可以了。 Cocoa 容器保留和释放添加到它们的对象,因此指向 non-class 类型的指针必须用例如包装。 NSValue.

还要注意IBOutlet 不是类型,它是一个空宏,仅用于标记Interface Builder 的代码部分。

【讨论】:

好的,明白了,但我还是不明白如何解决我的问题,我应该在数组中插入什么才能让它工作?【参考方案2】:

你对问题的过度思考。默认情况下,对所有对象的所有引用都是指针。

这个:

IBOutlet UIButton *but1;

... 定义一个指针。

因此,所有对象的默认操作都使用指针。您通常甚至不必考虑它。要将指向 UIButton 的指针添加到 NSMutableArray 只需使用(注意 self 符号):

[self.buttons addObject:self.but1];

IBOutlet 名称对代码中的引用没有影响。它就在那里,因此 Interface Builder 可以解析源代码并找出应该注意哪些属性。否则,它什么也不做,你可以忽略它。

当然,我要问:为什么要将已经命名为属性的按钮放入数组中?

而不是这个:

[[buttons objectWithId:0] setImage:[UIImage imageNamed:@"image1.png"]];

...为什么不这样做呢?

[self.but1 setImage:[UIImage imageNamed:@"image1.png"] forState:UIControlStateNormal]; 

如果您不使用名称作为主要参考,那么使用命名属性没有多大意义。

【讨论】:

当然,如果我只有一个按钮,我会按照您的建议进行操作。事实是我不希望代码太长且难以阅读,因此我可以使用数组管理按钮想做。你的想法很棒,对我有很大帮助,但如果我错过属性,我无法将 IB 对象链接到代码,这就是为什么我要声明 9 次对象!

以上是关于用指针填充的 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章

正确填充字符指针

用子类填充的基类向量不起作用

LeetCode 树 116. 填充每个节点的下一个右侧节点指针(层序遍历 分层)

c ++使用指针访问对象的成员

如果我在函数中使用指针来填充列表,我是不是必须在 C++ 中删除该函数末尾的指针?

116. 填充每个节点的下一个右侧节点指针