iOS开发中的一些简单方法和容易混淆的概念
删除self.view中的所有subview
1.方法一:
NSArray *array = [self.view subviews];
[array makeObjectsPerformSelector:@selector(removeFromSuperview)];
Tips;
- (void)makeObjectsPerformSelector:(SEL)aSelector
方法简介:让数组中的每个元素,都调用选择器提供的方法,且此选择器提供的方法是不接受任何参数的。
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument
方法简介:与上面方法类似,区别是将argument做为参数传给aSelector方法
2.方法二:
NSArray *array = [self.view subviews];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[obj removeFromSuperview];
}];
3.方法三:
NSArray *array = [self.view subviews];
for (UIView *view in array){
[view removeFromSuperview];
}
weak是用来修饰对象的,assign是用来修饰基本数据类型的,当用assign来修饰对象时,会造成什么后果?
用weak修饰对象时,不会持有该对象。对象的引用计数就不会增加,当指向的对象被释放,weak修饰的对象会被置为nil,这样就避免了循环引用。assign是用来修饰常量对象的,当用assign来修饰一个obj对象时,当对象被释放时,assign修饰的对象不会被置为nil,这就有可能造成野指针,使程序crash。
例如:
interface TestObjViewController ()
@property (nonatomic, weak) id weakObj;
@property (nonatomic, assign) id assignObj;
@property (nonatomic, strong) id strongObj;
@end
@implementation TestObjViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.strongObj = [[NSObject alloc] init];
self.weakObj = self.strongObj;
self.assignObj = self.strongObj;
self.strongObj = nil;
NSLog(@"%p", self.weakObj); //0x0
NSLog(@"%p", self.assignObj); //crash
}
@end