Я пишу этот метод категории 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;
}
Я думаю, это привлекает ваше внимание к тому факту, что используется assign
, а не сохранить
или копию
]. Поскольку NSString
является объектом, в среде с подсчетом ссылок (т. Е. Без сборки мусора) это может быть потенциально «опасным» (если только это не сделано намеренно).
Однако разница между assign
, keep
и copy
выглядят следующим образом:
assign : в вашем методе установки для свойства есть простое присвоение вашего экземпляра переменную на новое значение, например:
- (void) setString: (NSString *) newString
{
строка = newString;
}
Это может вызвать проблемы, поскольку объекты Objective-C используют подсчет ссылок, и поэтому, не сохраняя объект, есть шанс, что строка может быть освобождена, пока вы все еще ее используете.
сохранить : это сохраняет новое значение в вашем методе установки. Например:
- (void) setString: (NSString *) newString
{
[сохранение новой строки];
[выпуск струны];
строка = newString;
}
Это безопаснее, так как вы явно заявляете, что хотите сохранить ссылку на объект, и вы должны освободить ее, прежде чем она будет освобождена.
copy : это создает копию строки в вашем метод установки:
- (void) setString: (NSString *) newString
{
если (строка! = newString)
{
[выпуск струны];
строка = [копия новой строки];
}
}
Это часто используется со строками, поскольку создание копии исходного объекта гарантирует, что он не будет изменен, пока вы его используете.
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];
}
}
Какао использует подсчет ссылок для управления памятью. Объекты со счетчиком ссылок 0 удаляются.
Подробнее здесь , в собственной документации Apple.