NSString Не указан атрибут «assign», «retain» или «copy»

Я пишу этот метод категории UIView для решения этой проблемы, использует отдельные представления для тени и радиуса угла.

-(UIView *)shadowedWrapViewWithBounds:(CGRect)bounds {
UIView *baseView = [[UIView alloc] init];
baseView.bounds = bounds;
baseView.backgroundColor = [UIColor clearColor];
baseView.layer.shadowColor = [UIColor blackColor].CGColor;
baseView.layer.shadowOffset = CGSizeMake(0, 0);
baseView.layer.shadowOpacity = 0.7;
baseView.layer.shadowRadius = 4.0;

// improve performance
baseView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:baseView.bounds cornerRadius:4].CGPath;
baseView.layer.shouldRasterize = YES;
baseView.layer.rasterizationScale = [UIScreen mainScreen].scale;

[baseView addSubview:self];
//use Masonry autolayout, self can set corner radius
[self makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(baseView);
}];

return baseView;
}
13
задан Midhun MP 11 February 2014 в 06:35
поделиться

3 ответа

Я думаю, это привлекает ваше внимание к тому факту, что используется assign , а не сохранить или копию ]. Поскольку NSString является объектом, в среде с подсчетом ссылок (т. Е. Без сборки мусора) это может быть потенциально «опасным» (если только это не сделано намеренно).

Однако разница между assign , keep и copy выглядят следующим образом:

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

     - (void) setString: (NSString *) newString
    {
     строка = newString;
    }
    

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

  • сохранить : это сохраняет новое значение в вашем методе установки. Например:

     - (void) setString: (NSString *) newString
    {
     [сохранение новой строки];
     [выпуск струны];
     строка = newString;
    }
    

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

  • copy : это создает копию строки в вашем метод установки:

     - (void) setString: (NSString *) newString
    {
     если (строка! = newString)
     {
     [выпуск струны];
     строка = [копия новой строки];
     }
    }
    

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

31
ответ дан 1 December 2019 в 17:59
поделиться

assign - ivar устанавливается путем выполнения простого задания. Реализация:

- (void) setFoo:(NSString *)newFoo {
  foo = newFoo;
}

сохранить - ivar отправляет сообщение сохранения перед выполнением присваивания. Реализация:

- (void) setFoo:(NSString *)newFoo {
  if (foo != newFoo) {
    [foo release];
    foo = [newFoo retain];
  }
}

copy - ivar отправляет сообщение копирования перед выполнением назначения. Реализация:

- (void) setFoo:(NSString *)newFoo {
  if (foo != newFoo) {
    [foo release];
    foo = [newFoo copy];
  }
}
3
ответ дан 1 December 2019 в 17:59
поделиться

Какао использует подсчет ссылок для управления памятью. Объекты со счетчиком ссылок 0 удаляются.

  • assign - ничего не делает для счетчика ссылок просто указывает вашу переменную на данные
  • keep - указывает вашу переменную на данные и добавляет 1 к счетчику ссылок, данные гарантированно будут там пока ваша переменная все еще жива
  • copy - делает копию данных, указывает на нее вашу переменную и делает счетчик сохранения 1

Подробнее здесь , в собственной документации Apple.

10
ответ дан 1 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

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