Objective c 从现有指针构建指针数组

Objective c 从现有指针构建指针数组,objective-c,cocoa,pointers,Objective C,Cocoa,Pointers,我有一个类,它必须以同样的方式初始化一组相似的对象 NSNumber *a = nil; NSNumber *b = nil; NSNumber *c = nil; a、 b和c是现有对象的成员变量。在我的代码中,我使用了一个更复杂的NSObject子类,但这个示例使用NSNumber更容易理解 所有3个对象都必须以类似的方式初始化。因此,我想构建一个指针数组,可以在for循环中使用,如下所示: NSPointerArray *objs = [NSPointerArray weakObject

我有一个类,它必须以同样的方式初始化一组相似的对象

NSNumber *a = nil;
NSNumber *b = nil;
NSNumber *c = nil;
a、 b和c是现有对象的成员变量。在我的代码中,我使用了一个更复杂的NSObject子类,但这个示例使用NSNumber更容易理解

所有3个对象都必须以类似的方式初始化。因此,我想构建一个指针数组,可以在for循环中使用,如下所示:

NSPointerArray *objs = [NSPointerArray weakObjectsPointerArray];
[objs addPointer:&a];
[objs addPointer:&b];
[objs addPointer:&c];
运行上述代码时,会出现以下错误:

error: address doesn't contain a section that points to a section in a object file
我如何构建一个可以使用这样的循环进行探索的数组

    for (id *o in objs) {
        *o = @2;
    }

只需将指针包装在“NSValue”对象中,就可以了

id v1 = [NSValue valueWithPointer:p1];
id v2 = [NSValue valueWithPointer:p2];
id v3 = [NSValue valueWithPointer:p3];

id array = @[v1,v2,v3];

for(NSValue *value in array) {
    void *pointer = value.pointerValue;
    NSNumber *n = (__bridge NSNumber*)pointer;
}
演示您想做的事情:(NSNumbers是不可变的)

#导入
int main(int argc,char*argv[]){
@自动释放池{
国家统计局编号*a;
NSB编号*b;
NSArray*os=@[[NSValue valueWithPointer:&a],
[NSValue valueWithPointer:&b]];
用于(操作系统中的NSValue*v){
void*指针=[v pointerValue];
NSNumber**n_ptr=(__桥NSNumber**)指针;
*n_ptr=@2.0;
}
NSLog(@“%@%@”,a,b);
}
}

只需将指针包装在“NSValue”对象中,就可以了

id v1 = [NSValue valueWithPointer:p1];
id v2 = [NSValue valueWithPointer:p2];
id v3 = [NSValue valueWithPointer:p3];

id array = @[v1,v2,v3];

for(NSValue *value in array) {
    void *pointer = value.pointerValue;
    NSNumber *n = (__bridge NSNumber*)pointer;
}
演示您想做的事情:(NSNumbers是不可变的)

#导入
int main(int argc,char*argv[]){
@自动释放池{
国家统计局编号*a;
NSB编号*b;
NSArray*os=@[[NSValue valueWithPointer:&a],
[NSValue valueWithPointer:&b]];
用于(操作系统中的NSValue*v){
void*指针=[v pointerValue];
NSNumber**n_ptr=(__桥NSNumber**)指针;
*n_ptr=@2.0;
}
NSLog(@“%@%@”,a,b);
}
}

您是否有可能试图在数组中存储弱引用?原因
NSPointerArray
不支持此项。您说不支持是什么意思?NSPointerArray具有弱指针数组构造函数和强指针数组构造函数。我知道这些构造函数描述的是数组指针的弱/强关系,而不是我插入的指针。在我的示例中,@[a,b,c]是强指针,这就是我使用weakObjtsPointerArray构造函数的原因。你说得对,NSPointerArray可以容纳弱引用。但是NSPointerArray的文档页面上说:“重要提示:NSPointerArray不支持自动引用计数(ARC)下的弱引用。”“老实说,我不知道如何解释:)您是否有可能尝试在数组中存储弱引用?原因
NSPointerArray
不支持此项。您说不支持是什么意思?NSPointerArray具有弱指针数组构造函数和强指针数组构造函数。我知道这些构造函数描述的是数组指针的弱/强关系,而不是我插入的指针。在我的示例中,@[a,b,c]是强指针,这就是我使用weakObjtsPointerArray构造函数的原因。你说得对,NSPointerArray可以容纳弱引用。但是NSPointerArray的文档页面上写着:“重要提示:NSPointerArray不支持自动引用计数(ARC)下的弱引用。”老实说,我不知道如何解释这一点:)它不像
NSPointerArray
那么方便,但我认为它的限制更少!很久以前,我有C++的思维方式,在价值对象中包装东西。这回答了我问题的第一部分,但现在我对第二部分有问题。我需要将(void)指针转换成我可以用来更改它引用的变量值的东西。看看我的例子,我需要(NSNumber**)之类的东西,但我无法编译它。我正在尝试修复位于的代码。我想我很快就能自己解决这个问题了,但我在ARC之后跳到了Cocoa,从来没有和指针发生过这样的冲突:(使用id
n=(uu桥NSNumber*))
-添加到示例中的是正确的强制转换吗?我得到了一个运行时错误。请原谅我使用Gist而不是StackOverflow,但在那里我有编辑和行号的版本控制。我按照您在第9行所说的做,这似乎是错误的,因为我将(NSNumber**)分配给了(NSNumber*)。以下几行是我认为它应该是什么样子的,除了我无法让Xcode不被(NSNumber**)声明吓坏:刚刚解决了ARC兼容版本。关键是用(u bridge void*)我现在终于得到了答案,AcAcple并不像《代码》> NSPointerArray < /Cord>那么方便,但是我的限制已经很小了!很久以前我就有了C++的思维模式来包装价值对象。这回答了我的问题的第一部分,但是现在我在第二部分遇到了问题。指针指向某个我可以用来更改它引用的变量值的对象。查看我的示例,我需要类似(NSNumber**)的内容,但无法将其编译。我正在尝试修复代码。我想我很快就能自己解决它了,但我在ARC之后跳转到Cocoa,从未与指针发生过这样的冲突:(使用id
n=(uu bridge NSNumber*)
-添加到示例中的是正确的强制转换吗?我得到了一个运行时错误。请原谅我使用Gist而不是StackOverflow,但在那里我有编辑和行号的版本控制。我按照您在第9行所说的做,这似乎是错误的,因为我给(NSNumber*)分配了一个(NSNumber**)。以下几行是我认为它应该是什么样子的,除了我无法让Xcode不被(NSNumber**)声明吓坏:刚刚解决了ARC兼容版本。关键是用(u bridge void*)强制转换。现在终于得到了您的答案ARC兼容