如何在Objective C中将对象添加到NSMutableArray?

Posted

技术标签:

【中文标题】如何在Objective C中将对象添加到NSMutableArray?【英文标题】:How to add an object to NSMutableArray in Objective C? 【发布时间】:2010-12-19 00:30:27 【问题描述】:
NSMutableArray *tblContents =  [NSMutableArray arrayWithObjects: @"1", @"2", @"3", nil];
[tblContents addObject:txtNewTableRow.text];

我的应用程序在第 2 行崩溃。 控制台中的错误消息是 'NSInvalidArgumentException',原因:'-[NSCFString addObject:]:无法识别的选择器发送到实例 xxx

顺便说一句,如果我用 alloc & init 替换 arraywithobjects 初始化,它就可以正常工作!

我只是创建一个可变数组并向其中添加一个对象。那里有什么问题?

谢谢 斯里达尔·雷迪

完整代码: .h:

#import <UIKit/UIKit.h>

@interface TableStarterViewController : UIViewController
<UITableViewDelegate, UITableViewDataSource>

    NSMutableArray *tblContents;

    IBOutlet UITextField *txtNewTableRow;
    IBOutlet UITableView *tblMain;


@property (nonatomic, retain) NSMutableArray *tblContents;
@property (nonatomic, retain) UITextField *txtNewTableRow;
@property (nonatomic, retain) UITableView *tblMain;

-(IBAction) addRowToTable;

@end

.m:

#import "TableStarterViewController.h"

@implementation TableStarterViewController

@synthesize tblContents;
@synthesize txtNewTableRow;
@synthesize tblMain;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return [tblContents count];


- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [[UITableViewCell alloc] 
                             initWithStyle:UITableViewCellStyleDefault 
                             reuseIdentifier:@"cell"];

    cell.textLabel.text = [tblContents objectAtIndex:indexPath.row];

    return cell;


-(IBAction) addRowToTable

    [tblContents addObject:txtNewTableRow.text];

    [tblMain reloadData];


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad 
    tblContents =  [NSMutableArray arrayWithObjects: @"1", @"2", @"3", nil];


    [super viewDidLoad];

这就是所有代码。

【问题讨论】:

这两行之间是否有更多代码?您的错误说 tblContents 包含一个字符串对象,而不是一个可变数组。 这个代码是正确的,应该可以工作。其他地方出了问题,可能与您的方法或对象中其他内容的内存管理有关,尽管我承认在这两行的空间中可能发生的事情并不明显。如果崩溃是 100% 可重复的,则确实意味着您正在向字符串对象发送 addObject 消息。在调试器中,在这一行尝试“po tblContents”,你的“instance XXX”中的XXX——和tblContents是同一个地址吗? 我同意 quixoto 的评论。您应该尝试启用 NSZombie 来调试它。 cocoadev.com/index.pl?NSZombieEnabled 启用僵尸并弹出此错误。 -[__NSArrayM addObject:]: message sent to deallocated instance 但我从不释放 tblContents 对象。为什么它会被释放! 【参考方案1】:

您没有保留该阵列,并且在您使用它之前它会被自动释放。确保在从 arrayWithObjects 取回指针后保留它。

另外,我不清楚 arrayWithObjects 是否会返回一个可变数组。否则,将导致进一步的问题。

编辑 1: Alloc 和 Init 返回一个保留计数为 1 的对象; arrayWithObjects 返回一个保留计数为 0 的对象。

编辑 2: 我拉出 Xcode 并验证 [NSMutableArray arrayWithObjects:] 返回一个 NSMutableArray (或根据 Xcode 一个 __NSArrayM)

【讨论】:

好吧,为了简单起见(为此),我给出了该代码。但实际上我在 .h 文件中定义了实例变量。让它成为一个属性,合成它,同时它是 NSMutableArray。但正如你所说,arrayWithObjects 可能存在问题。 他正在尝试访问 tblContents,它显示为 NSCFString。我见过的唯一一次是当一个对象被释放并且内存空间被重新用于不同类型的对象时。显然,我们没有很多代码。但是,一些内存是如何被释放和重新初始化的。 就arrayWithObjects的数据类型而言,文档只是说它返回NSArray;如果它确实返回 NSMutableArray,很好,但正如我所说,我不清楚 arrayWithObjects 返回什么。 这里是 NSMutableArray 的文档:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…。没有 arrayWithObjects 方法。然而,它在 NSArray 上并列出了 NSArray 的返回类型。 如果 tblContents 在标头中定义,很有趣的是,您没有收到有关在该代码中重新声明它的警告。你知道,'本地声明隐藏实例变量'或其他。【参考方案2】:

而不是,

tblContents =  [NSMutableArray arrayWithObjects: @"1", @"2", @"3", nil];

试试这个,

tblContents =  [NSMutableArray initWithObjects: @"1", @"2", @"3", nil];

【讨论】:

【参考方案3】:

正如 aepryus 所提到的,arrayWithObjects 是从 NSArray 继承的,它实际上可能会返回 NSArray。因此问题。 有人知道如何用对象初始化 NSMutableArray 吗?

【讨论】:

当在 NSMutableArray 类上调用时,它会返回一个 NSMutableArray。即使它返回一个 NSArray,他也不会得到那个错误。 我验证了 [NSMutableArray arrayWithObjects:] 实际上确实返回了一个 NSMutableArray,所以你可以接受。问题是您的 Array 在您以某种方式使用它之前已被释放。仔细检查 tblContents 对象是否在没有被保留的情况下被释放。

以上是关于如何在Objective C中将对象添加到NSMutableArray?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Objective c中将捕获图像添加到UITableView

如何在Objective-C中将二维整数数组对象添加到NSMutableArray?

如何在 Swift 或 Objective C 中将文本添加到文件中?

如何在objective-c中将约束添加到UImageView

如何在 Objective-C 中将带有补充视图的标题添加到 UiCollectionView?

如何在Objective-C中将char添加到NSNumber?