C++ 在Objective-C中使用std::list?

C++ 在Objective-C中使用std::list?,c++,objective-c,ios,linked-list,objective-c++,C++,Objective C,Ios,Linked List,Objective C++,我刚刚发现Objective-C中没有LinkedList实现,但我需要一个。所以我将使用std::list(或者有更好的替代方案?) 我的问题是:在ARC和非ARC下,我应该关心内存管理吗? < P>你应该手动维护内存管理,因为STD::列表是C++容器。或者可以使用 NSMutableArray ,将其视为链表,用 >插入对象附加新元素:AtIndex:最后一个索引,用迭代器、“代码> ReVelastObjs< /Cuff>”等迭代。 < P>您应该手动维护内存管理,因为STD::LIST

我刚刚发现Objective-C中没有LinkedList实现,但我需要一个。所以我将使用
std::list
(或者有更好的替代方案?)


我的问题是:在ARC和非ARC下,我应该关心内存管理吗?

< P>你应该手动维护内存管理,因为STD::列表是C++容器。或者可以使用<代码> NSMutableArray <代码>,将其视为链表,用<代码> >插入对象附加新元素:AtIndex:最后一个索引,用迭代器、“代码> ReVelastObjs< /Cuff>”等迭代。

< P>您应该手动维护内存管理,因为STD::LIST是C++容器。或者可以使用<代码> NSMutableArray <代码>,将其视为链表,用<代码> >插入对象附加新元素:AtIndex:< /C>最后一个索引,用迭代器迭代,<代码> ReleVistAbjs< /C> >等。

< P>您可以使用自定义C++智能指针(Objul-C++):

模板
类objc_ptr{
私人:
X*ptr;
公众:
~objc_ptr(){
如果(ptr!=NULL)[ptr释放];
}
objc_ptr(){
}
objc_ptr(X*X){
这个。ptr=x;
如果(x!=NULL)[x保留];
}
//TODO,复制构造函数,运算符=。。。
};
然后您可以使用:std::list>

或者使用boost intrusive_ptr:

void intrusive_ptr_add_ref(NSObject *x) {
  [x retain];
}
void intrusive_ptr_release(NSObject *x) {
  [x release];
}

std::list<boost::intrusive_ptr<NSFooBar>> list = ...;
void intrusive\u ptr\u add\u ref(NSObject*x){
[x保留];
}
无效侵入性ptr释放(NSObject*x){
[x发布];
}
标准::列表=。。。;

<代码> > p>您可以使用自定义C++智能指针(在ObjtoVC++中):

模板
类objc_ptr{
私人:
X*ptr;
公众:
~objc_ptr(){
如果(ptr!=NULL)[ptr释放];
}
objc_ptr(){
}
objc_ptr(X*X){
这个。ptr=x;
如果(x!=NULL)[x保留];
}
//TODO,复制构造函数,运算符=。。。
};
然后您可以使用:std::list>

或者使用boost intrusive_ptr:

void intrusive_ptr_add_ref(NSObject *x) {
  [x retain];
}
void intrusive_ptr_release(NSObject *x) {
  [x release];
}

std::list<boost::intrusive_ptr<NSFooBar>> list = ...;
void intrusive\u ptr\u add\u ref(NSObject*x){
[x保留];
}
无效侵入性ptr释放(NSObject*x){
[x发布];
}
标准::列表=。。。;


由于gcc/clang的Objective-C++模式,您确实可以使用
std::list
。您需要切换到.mm文件名扩展以启用它,并且您可能希望避免在头文件中使用C++类型,或者导入这些头文件的所有文件也需要更改为.mm。如果
std::list
的类型参数不使用objective-C类类型,则可以。如果是,并且您没有使用ARC,则需要确保正确保留/释放。我不知道它是如何工作的,但我怀疑你应该有选择地禁用ARM为你的.mm文件。谢谢@ PMJordon,这个信息有很大帮助,它揭示了一些关于如何使用C++在ObjuleC(我是新的语言^ ^)。什么是错误的<代码> NSMutableArray < /代码>?嗨,@ JeremyP,<代码> NSMutableArray < /代码>是伟大的,但一小时前我对它了解不多,我以为它是作为原始数组实现的,结果证明是错误的。说实话。由于gcc/clang的Objective-C++模式,您确实可以使用
std::list
。您需要切换到.mm文件名扩展以启用它,并且您可能希望避免在头文件中使用C++类型,或者导入这些头文件的所有文件也需要更改为.mm。如果
std::list
的类型参数不使用objective-C类类型,则可以。如果是,并且您没有使用ARC,则需要确保正确保留/释放。我不知道它是如何工作的,但我怀疑你应该有选择地禁用ARM为你的.mm文件。谢谢@ PMJordon,这个信息有很大帮助,它揭示了一些关于如何使用C++在ObjuleC(我是新的语言^ ^)。什么是错误的<代码> NSMutableArray < /代码>?嗨,@ JeremyP,<代码> NSMutableArray < /代码>是伟大的,但一小时前我对它了解不多,我以为它是作为原始数组实现的,结果证明是错误的。说实话。我看不懂
NSMutableArray
的源代码,但从它的名字来看,我可以想象它被实现为持有一个内部数组并将对象放入该数组中,这对于执行
removeLastObject
insertObject:atIndex
之类的操作是无效的。通过手动管理内存,您的意思是我必须在将每个对象添加到列表之前保留它,并在删除列表之前释放列表中的所有对象吗?例如,它可能会实现为一个deque。如果您的意思是这样的话,它不会实现为原始C数组。我会认真尝试首先使用NSMutableArray;如果性能是一个可测量的问题,请切换到其他方法。好的,我将尝试
NSMutableArray
。我不认为性能对我将使用LinkedList的senario来说是个问题,因为它不会容纳那么多对象。谢谢@Wevah,@Alexander~我看不懂
NSMutableArray
的源代码,但从它的名字来看,我可以想象它被实现为持有一个内部数组并将对象放入该数组中,这对于执行
removelasobject
insertObject:dexatin
之类的操作是没有效率的。通过手动管理内存,您的意思是我必须在将每个对象添加到列表之前保留它,并在删除列表之前释放列表中的所有对象吗?例如,它可能会实现为一个deque。如果您的意思是这样的话,它不会实现为原始C数组。我会认真尝试首先使用NSMutableArray;如果性能是一个可测量的问题,请切换到其他方法。好的,我将尝试
NSMutableArray
。我不认为性能对我将使用LinkedList的senario来说是个问题,因为它不会容纳那么多对象。谢谢@Wevah,@Alexander~对于我的问题,看起来有点过分了,不过这是一个很好的答案,谢谢!对我的问题来说似乎有点过分了,但这是一个很好的答案,谢谢!