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

posted @ 2015-09-22 17:58  Alex.xue  阅读(267)  评论(0编辑  收藏  举报