Это действительно зависит от Вашей ситуации.
, Если Ваши объекты являются маленькими, и выполнение копии объекта, легко, то хранение данных в stl контейнере просто и легче справиться, по-моему, потому что Вы не должны волноваться о пожизненном управлении.
, Если Вы возражаете, являются большими, и наличие конструктора по умолчанию не имеет смысла, или копии объектов являются дорогими, затем снабжать указателями является, вероятно, способом пойти.
, Если Вы решаете использовать указатели на объекты, смотрите на Библиотека Контейнера Указателя Повышения . Эта библиотека повышения обертывает все контейнеры STL для использования с динамично выделенными объектами.
Каждый контейнер указателя (например, ptr_vector) берет владение объекта, когда это добавляется к контейнеру и управляет временем жизни тех объектов для Вас. Вы также доступ все элементы в ptr_ контейнере ссылкой. Это позволяет Вам сделать вещи как
class BigExpensive { ... }
// create a pointer vector
ptr_vector bigVector;
bigVector.push_back( new BigExpensive( "Lexus", 57700 ) );
bigVector.push_back( new BigExpensive( "House", 15000000 );
// get a reference to the first element
MyClass& expensiveItem = bigList[0];
expensiveItem.sell();
, Эти классы обертывают контейнеры STL и работают со всеми алгоритмами STL, которые действительно удобны.
существуют также средства для передачи владения указателя в контейнере вызывающей стороне (через функцию выпуска в большинстве контейнеров).
guard let url = URL(string: "http://www.example.com") else {
return
}
do {
let html = try String(contentsOf: url)
}
catch {
//handle `error` here
}
guard let url = NSURL(string: "http://www.example.com") else {
return
}
do {
let html = try String(contentsOfURL: url)
}
catch {
//handle `error` here
}
NSString *url = @"http://www.example.com";
NSURL *urlRequest = [NSURL URLWithString:url];
NSError *err = nil;
NSString *html = [NSString stringWithContentsOfURL:urlRequest encoding:NSUTF8StringEncoding error:&err];
if(err)
{
//Handle
}