Цель C - назначить, скопировать, сохранить

Я новичок в Objective C. У меня есть базовые знания в C, включая концепцию указателей. У меня есть два основных вопроса:

  • Может кто-нибудь объяснить разницу между назначением, копированием и сохранением с некоторой аналогией?
  • Как вы обрабатываете функцию, которая возвращает переменную указателя, и как вы выполняете обмен сообщениями с помощью указателя возврата?

Ответ 1

Обновленный ответ для измененной документации

Информация теперь распространяется на несколько руководств в документации. Вот список требуемых значений:

Теперь ответ на этот вопрос полностью зависит от того, используете ли вы приложение, управляемое ARC (современное значение по умолчанию для новых проектов) или принудительное ручное управление памятью.

Назначить против слабых. Использовать присваивать, чтобы указать указатель свойства на адрес объекта, не сохраняя его или иным образом его курировать; используйте слабый, чтобы свойство автоматически указывало на нуль, если назначенный ему объект освобожден. В большинстве случаев вы захотите использовать слабый, чтобы не пытаться получить доступ к освобожденному объекту (незаконный доступ к адресу памяти - "EXC_BAD_ACCESS" ), если вы не выполняете правильную очистку.

Сохранять и копировать. Объявленные свойства по умолчанию используют сохранить (так что вы можете просто опустить его полностью) и автоматически управляет счетчиком ссылок на объекты, если назначается другой объект к собственности или она установлена ​​на ноль; Используйте копировать, чтобы автоматически отправить вновь назначенный объект a -copy сообщение (которое создаст копию переданного объекта и вместо этого назначит эту копию свойству - полезно (даже требуется) в некоторых ситуациях, где назначенный объект может быть изменен после того, как он будет установлен как свойство какого-либо другого объекта (что означало бы, что модификация/мутация применимы и к этому свойству).

Ответ 2

Руководство по программированию памяти из справочной библиотеки iOS имеет основы назначения, копирования и сохранения с аналогами и примерами.

копияДелает копию объекта и возвращает его с сохранением числа в 1. Если вы копируете объект, у вас есть копия. Это относится к любому методу, который содержит копию слова, где "копия" относится к возвращаемому объекту.

сохранить Увеличивает количество удержаний объекта на 1. Принимает участие в объект.

release Уменьшает количество сохраняемых объектов на 1. Отменяет владение объектом.

Ответ 3

Копировать vs Назначить vs Сохранить

Назначение - это примитивные значения типа BOOL, NSInteger или double. Для объектов используйте сохранение или копирование, в зависимости от того, хотите ли вы сохранить ссылку на исходный объект или сделать его копию.

скрытая функция

NSString * string ;

Когда вы вызываете это выражение

string = @"Your name";

метод будет автоматически вызван

- (void)setString:(NSString*)newString
{
        
}
  • Присвоить

В вашем методе setter для свойства есть простое назначение вашей переменной экземпляра к новому значению,

- (void)setString:(NSString*)newString
{
        
   string = newString;
}

Это может вызвать проблемы, поскольку объекты Objective-C используют подсчет ссылок и, следовательно, не сохраняя объект, есть вероятность, что строка может быть освобождена, пока вы все еще используете ее.

  • Сохранить

это сохраняет новое значение в методе setter. Например: безопаснее, поскольку вы прямо заявляете, что хотите сохранить ссылку на объект, и вы должны освободить его, прежде чем он будет перераспределена.

- (void)setString:(NSString*)newString
{
         
       [newString retain];
         
       [string release];
           
       string = newString;
        
}
  • Копировать

это делает копию строки в методе setter: это часто используется со строками, так как копирование исходного объекта обеспечивает что он не изменяется, пока вы его используете.

    - (void)setString:(NSString*)newString
     {
           
             if(string!=newString){
             
                            [string release];
             
                            string = [newString copy];
           
       }
    
     }

Ответ 4

. Назначение - для примитивных значений типа BOOL, NSInteger или double. Для использования объектов сохраняйте или копируйте, в зависимости от того, хотите ли вы сохранить ссылку на исходный объект или сделать его копию. · Assign: В вашем методе setter для свойства есть простое назначение переменной экземпляра для нового значения, например:

-(void)setString:(NSString*)newString{
     
        string = newString;

    }

Это может вызвать проблемы, поскольку объекты Objective-C используют подсчет ссылок, и поэтому, не сохраняя объект, существует вероятность того, что строка может быть освобождена, пока вы все еще используете ее. · Сохранить: это сохраняет новое значение в методе setter. Например: Это безопаснее, поскольку вы явно заявляете, что хотите сохранить ссылку на объект, и вы должны освободить его, прежде чем он будет освобожден.

- (void)setString:(NSString*)newString{
     
        [newString retain];
     
          [string release];
       
 string = newString;
    
}

· copy: это делает копию строки в методе setter: Это часто используется со строками, так как копирование исходного объекта гарантирует, что оно не будет изменено, пока вы его используете.

- (void)setString:(NSString*)newString{
       
         if(string!=newString){
         
                        [string release];
         
                        string = [newString copy];
       
         }

    }

Ответ 5

  • назначить

    • assign - атрибут свойства по умолчанию
    • assign - это атрибут свойства, который сообщает компилятору, как синтезировать реализацию установщика свойств
  • Копия:

    • требуется копирование, когда объект изменен.
    • copy возвращает объект, который вы должны явно освободить (например, в dealloc) в средах, не связанных с мусором
    • вам нужно освободить объект, когда закончите с ним, потому что вы сохраняете копию
  • сохранить

    • указывает, что новое значение должно быть отправлено "-принять" при назначении и отправлено старое значение "-release"
    • Если вы напишете, сохраните, он будет работать как сильный
    • Такие методы, как "alloc", включают неявное "сохранение"

Ответ 6

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)

Ответ 7

сохранить vs. copy vs. assign

" присваивать" по умолчанию. В сеттер, созданный с помощью @synthesize, значение будет просто присвоено атрибуту. Я понимаю, что для атрибутов без указателя следует использовать "assign".

" сохранить" необходимо, когда атрибут является указателем на объект. Сеттер, сгенерированный с помощью @synthesize, сохранит (ака добавит счетчик удержания) объекта. Вам нужно будет освободить объект, когда вы закончите с ним.

" копировать" необходимо, когда объект изменен. Используйте это, если вам нужно значение объекта, как оно есть в данный момент, и вы не хотите, чтобы это значение отражало любые изменения, сделанные другими владельцами объекта. Вам нужно будет освободить объект, когда вы закончите его, потому что вы сохраняете копию.