Objective c 目标C集合中的C样式指针

Objective c 目标C集合中的C样式指针,objective-c,c,pointers,nsarray,Objective C,C,Pointers,Nsarray,我需要更改已放入NSMutableArray的项的值,而不知道它是什么变量。可能吗?在C语言中,我相信这可以通过使用指针来实现 int i = 0; int *j = &i; *j = 5; NSLog (@"'%d'",i); // Prints '5' 如何将其转换为目标C?因此,如果我将2个NSString放入NSMutableArray中: NSString *text1 = @"Hello"; NSMutableString *text2 = @"World"; NSMuta

我需要更改已放入
NSMutableArray
的项的值,而不知道它是什么变量。可能吗?在C语言中,我相信这可以通过使用指针来实现

int i = 0;
int *j = &i;
*j = 5;
NSLog (@"'%d'",i); // Prints '5'
如何将其转换为目标C?因此,如果我将2个NSString放入NSMutableArray中:

NSString *text1 = @"Hello";
NSMutableString *text2 = @"World";
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:text1,text2,nil];
然后过一会儿

[arr objectAtIndex:1] = @"Everyone";
NSLog (@"'%@'",text2); // I want this to print 'Everyone'
我该怎么做?此语法在最后一个代码块的第一行给出了一个错误
表达式不可赋值

如果我稍微修改一下,使其看起来更像第一个代码块中的C代码:

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:&text1,&text2,nil];

我得到一个ARC错误
不允许将间接指针隐式转换为指向“id”的Objective-C指针,第一行是ARC
,第二行是
从不兼容的类型“NSString*”分配给“id”。我尝试了其他一些轻微的调整,但都有一些错误

很明显,我做得不对,但我已经没有主意了


编辑:它认为我正在尝试创建一个新字符串,并替换我以前在索引1中拥有的字符串。这不是我想做的。我基本上是在尝试使用数组来更改变量的值,而不必使用变量的名称(在我的实际项目中,当我需要更改它时,我不知道它的名称)。

在所有面向对象编程语言(如Objective-C)中,我们使用对象正是为了这个目的

所以你走对了方向。NSArray或NSMutableArray分别允许您收集任何类型的对象并使用索引访问它们

你的

真像

[arr addObject:@"Everyone"]; // That would add it to the end or

[arr insertObject:@"Everyone" atIndex:1]; // that would insert it at index 1. 
请记住,数组从索引0开始。 而
arr
必须为该类型的
NSMutabelArray

现代的Ojective-C编译器提供了快捷方式,例如

NSLog (@"index %d of the array: %@", 1, arr[1]); 
你的第二个问题是:

NSArray *arr = [NSArray arrayWithObject:@"me", @"everybody else", nil]; //now goes as
NSArray *arr = @[@"me", @"everybody else"];

您看不到不同文本的原因是因为objective C string是不可变的,并且您实际上已使用以下命令将一个新对象插入到数组中: [arr objectAtIndex:1]=@“所有人”

在您的示例中,您可以通过使用NSMutableString,从数组中检索它,并对其调用setString来实现所需的功能


在一般情况下,如果您将一个对象插入NSArray,并且您正在修改该对象,它将反映在所有其他对它的引用中。

NSMutableArray
部分的理解很好,但我想我没有解释我要做的事情。我不想替换我在数组中引用的对象,我想引用同一个对象,但将它的值更改为不同的值。这有意义吗?我编辑了我的OP,试图更好地解释我的目标。@GeneralMike听起来像是在寻找
exchangeObjectAtIndex:withObject:
或自定义
CFArray
,您可以向其添加原始指针,然后执行
*CFArrayGetValueAtIndex(arr,idx)=foo
。嗯,这怎么不是编程的问题?“最低限度的理解”。缺席.omg,太多的derp。我确实声明了我的
text2
作为
NSMutableString
,这正是你提到的原因,但后来我忘记了我需要调用
setString
来更改它的值(而不仅仅是
=@“所有人”
).我以为我在你最后一句话的某个地方看到了你所说的,但当这不起作用时,我以为不是这样,开始到处寻找另一种方法,当时我一直都有正确的想法,只是用错误的语法分配了一个新值。我不敢相信我错过了,非常感谢。
NSLog (@"index %d of the array: %@", 1, arr[1]); 
NSArray *arr = [NSArray arrayWithObject:@"me", @"everybody else", nil]; //now goes as
NSArray *arr = @[@"me", @"everybody else"];