gpt4 book ai didi

ios - 使用 NSMutableArray 来保存对象

转载 作者:行者123 更新时间:2023-11-28 20:04:23 26 4
gpt4 key购买 nike

我认为我缺少一些关于 Xcode Objective C 编程标准的基础知识。不幸的是,我找不到适合我的问题的解决方案。

问题是,当我尝试将数据保存在对象数组中时,就不可能将它们分开保存。添加新对象会覆盖数组中以前的对象。这是一些关于它的代码:

CustomObject.m 文件:

#import "CustomObject.h"

NSString * title;
NSString * detail;

@implementation CustomObject
- (void) initCustomObjectWithValues : (NSString *) iTitle : (NSString *) iDetail {
title = [NSString stringWithString:iTitle];
detail = [NSString stringWithString:iDetail];
}
- (NSString *) getTitle {
return title;
}
- (NSString *) getDetail {
return detail;
}

@end

ViewController.m文件中的viewDidLoad函数:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

myMutableArray = [[NSMutableArray alloc] init];

for (int i=0; i<10; i++) {
NSString * tempTitle = [@"title " stringByAppendingString:[NSString stringWithFormat:@"%d",i]];
CustomObject * myCustomObject = [[CustomObject alloc] init];
[myCustomObject initCustomObjectWithValues :[NSString stringWithFormat:@"%@",tempTitle]
:[@"detail " stringByAppendingString:[NSString stringWithFormat:@"%d",i]]];
[myMutableArray addObject:myCustomObject];
}

for (int i=0; i<10; i++) {
NSLog(@"%@",[[myMutableArray objectAtIndex:i] getTitle]);
NSLog(@"%@",[[myMutableArray objectAtIndex:i] getDetail]);
NSLog(@"----------------------------");
}

}

这里,myMutableArray 定义在 ViewController.m 文件的顶部。 (使其成为全局的,以便将来可以在其他功能中使用)

这是我在日志中得到的内容:

title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------
title 9
detail 9
----------------------------

据我所知,每个新添加的对象都会覆盖旧对象。首先我认为它们指的是相同的分配内存,但在调试工具 myMutableArray 中看起来像这样:

Printing description of myMutableArray:
<__NSArrayM 0x8d8cb60>(
<CustomObject: 0x8d8e990>,
<CustomObject: 0x8d8dd40>,
<CustomObject: 0x8d8d2e0>,
<CustomObject: 0x8d8d470>,
<CustomObject: 0x8d8d350>,
<CustomObject: 0x8d8ddf0>,
<CustomObject: 0x8d8df00>,
<CustomObject: 0x8d8df40>,
<CustomObject: 0x8d8dff0>,
<CustomObject: 0x8d8e0c0>
)

有没有人知道解决方案。它应该是非常基本的东西,但我无法解决问题。

先谢谢大家

最佳答案

使用

NSString * title;
NSString * detail;

@interface 部分之外创建全局变量。当您将变量分配给 titledetail 时,您没有设置对象的实例变量,而是更改了这些全局变量。因为它们是全局的,所以它们对于引用它们的所有对象都是相同的。

将那些全局变量变成实例变量,或者更好地使用@property

你的代码总体上是糟糕的 objective-c。
您不应在返回变量的 getter 中使用 get。您不应拥有以 init 开头且不返回 self 的方法。您应该只在 [[Foo alloc] init...] 情况下调用 init。您应该避免在您的方法中使用未命名的参数。并且不需要从字符串中创建字符串。

我是这样写的:

// CustomObject.h
@interface CustomObject : NSObject
@property (copy, nonatomic) NSString * title;
@property (copy, nonatomic) NSString * detail;

- (id)initWithTitle:(NSString *)title detail:(NSString *)detail
@end

// CustomObject.m
#import "CustomObject.h"

@implementation CustomObject

- (id)initWithTitle:(NSString *)title detail:(NSString *)detail {
self = [super init];
if (self) {
// use stringWithString: to create @"" strings when title is nil
// if nil is a valid value for those variables you should use
// _title = [title copy];
_title = [NSString stringWithString:title];
_detail = [NSString stringWithString:detail];
}
return self;
}

@end

for (int i=0; i<10; i++) {
NSString *tempTitle = [NSString stringWithFormat:@"title %d",i];
NSString *tempDetail = [NSString stringWithFormat:@"detail %d",i];
CustomObject * myCustomObject = [[CustomObject alloc] initWithTitle:tempTitle detail:tempDetail];
[myMutableArray addObject:myCustomObject];
}

for (int i=0; i<10; i++) {
CustomObject *object = myMutableArray[i];
NSLog(@"%@", object.title);
// or NSLog(@"%@", [object title]); if you don't like dot-notation.
NSLog(@"%@", object.detail);
NSLog(@"----------------------------");
}

关于ios - 使用 NSMutableArray 来保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com