为什么80%的码农都做不了架构师?>>>
比如你在一个方法里面有这样的代码(没有arc):
Person *person = [[Person alloc] init:@"kut"];
[person show];
[person release];
而在使用arc时,你也就不需要向person发送release消息了。如下
Person *person = [[Person alloc] init:@"kut"];
[person show];
xcode为自动为你添加release代码,当然,这是在编译时做的事情。
而定义属性时,会用到两个关键字:strong, weak,强引用和弱引用。其实就是拥有者和引用者的区别,比如说,你拥有一个对象,那么你就负责该对象的释放,你就是拥有者。而你只是引用一个对象,对象的清理和你没有关系,那么你就是引用者。按照这样的逻辑,当拥有者释放一个对象时,其它引用者原引用这个对象的实例变量就会变成nil。
比如:在Person类中有一个属性name,Person拥有这个name:
@property (strong) NSString *name;
而在Team类中,他只是引用这个Person的name:
@property (weak) NSString *managerName;
那么当person.name = nil;时,而team.name也会自动变为nil。
当我写到这儿的时候,我发现了一个问题,其实真实并不是这样运作的,-_-,让我再实验一下先。
@interface Person : NSObject
@property (strong) NSString *name;
@end
@interface Team : NSObject
@property (strong) Person *manager;
- (id)init;
@end
@implementation Team
@synthesize manager;
- (id)init
{
if (self = [super init]) {
Person *person = [[Person alloc] init];
person.name = @"kut";
self.manager = person;
}
return self;
}
@end
@interface Group : NSObject
@property (weak) Person *leader;
@end
int main(int argc, char *argv[])
{
@autoreleasepool {
Team *team = [[Team alloc] init];
// code 1
NSLog(@"team manager: %@", team.manager.name);
Group *group = [[Group alloc] init];
group.leader = team.manager;
// code 2
NSLog(@"group leader: %@", group.leader.name);
team.manager = nil;
NSLog(@"team manager: %@", team.manager.name);
NSLog(@"group leader: %@", group.leader.name);
}
}
像上面的代码,运行结果会大出你意料,最后一条NSLog输出group leader: kut,而不是group leader: (null)。
但是如果把//code 2下的NSLog语句去掉,则最后一条NSLog输出则按上面的诠述一样运行,输出的是group leader: (null)。
这里增加了arc的不确定性,如果weak引用的对象在此次使用之前被使用过一次,那么它一直存在,直到autoreleasepool释放它,否则就是nil,这样就麻烦了,如果代码层次很多,那么就不能保证能确定之前如果被使用过,这样代码运行的结果的不确定性就让人很头疼了。
建议不要用arc,就上面这一点就足以让我放弃使用它了。