Как скопировать объект в Objective C

Необходимо быть в состоянии получить объект StackTrace вместо строки путем высказывания

var trace = new System.Diagnostics.StackTrace(exception);

, можно тогда посмотреть на кадры сами, не полагаясь на форматирование платформы.

См. также: ссылка StackTrace

110
задан Cœur 22 May 2019 в 08:45
поделиться

1 ответ

Как всегда со ссылочными типами, есть два понятия «копия». Я уверен, что вы их знаете, но для полноты картины.

  1. Побитовая копия. Здесь мы просто копируем бит за битом - это то, что делает NSCopyObject. Почти всегда это не то, что вам нужно. Объекты имеют внутреннее состояние, другие объекты и т. Д. И часто предполагают, что только они содержат ссылки на эти данные. Побитовые копии нарушают это предположение.
  2. Глубокая логическая копия. В этом случае мы делаем копию объекта, но на самом деле не делаем это по частям - нам нужен объект, который ведет себя одинаково для всех намерений и целей, но не (обязательно) идентичный по памяти клон оригинала - Руководство по Objective C называет такой объект «функционально независимым» от его оригинала. Поскольку механизмы создания этих «интеллектуальных» копий различаются от класса к классу, мы просим сами объекты выполнить их. Это протокол NSCopying.

Вам нужен последний. Если это один из ваших собственных объектов, вам нужно просто принять протокол NSCopying и реализовать зону (id) copyWithZone: (NSZone *). Вы можете делать все, что хотите; хотя идея состоит в том, чтобы сделать настоящую копию себя и вернуть ее. Вы вызываете copyWithZone во всех своих полях, чтобы сделать глубокую копию. Простой пример:

@interface YourClass : NSObject <NSCopying> 
{
   SomeOtherObject *obj;
}

// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
  // We'll ignore the zone for now
  YourClass *another = [[YourClass alloc] init];
  another.obj = [obj copyWithZone: zone];

  return another;
}
189
ответ дан 24 November 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: