用指针填充的 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 容器,但是指向类类型对象的指针——比如你的 UIButton
s——就可以了。
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. 填充每个节点的下一个右侧节点指针(层序遍历 分层)