Ну, есть уже три ответа, которые охватывают основные вещи, поэтому я сосредоточусь на одной детали, которая еще не упомянута:
3.) Я не смог найти инструмент Leaks в Xcode 4.2. Куда это делось? Или мы не должны больше проверять утечки?
Да, нам все еще нужно проверить на утечки:
ARC - это не сборщик мусора, это автоматическое сохранение / освобождение.
Таким образом, все еще возможно - на самом деле, довольно легко - создавать утечки!
Рассмотрим следующий пример:
@class Puppet;
@protocol PuppetDelegate : <NSObject>
- (void)puppetDidTwistStrings:(Puppet *)puppet;
@end
@interface Puppet : NSObject {
id <PuppetDelegate> delegate_;
}
- (id)initWithPuppetDelegate:(id <PuppetDelegate>)delegate;
- (void)unravelStrings;
@end
@implementation Puppet
- (id)initWithPuppetDelegate:delegate
{
if (!(self = [super init])) return nil;
delegate_ = delegate;
return self;
}
// assume some implementation for unravel strings
@end
@interface MasterOfPuppets : NSObject <PuppetDelegate> {
NSMutableArray *puppets_;
}
- (void)puppetDidTwistStrings:(Puppet *)puppet;
- (void)bringOutAPuppet;
@end
@implementation
- (id)init
{
if (!(self = [super init])) return nil;
puppets_ = [[NSMutableArray alloc] init];
return self;
}
- (void)bringOutAPuppet
{
Puppet *newPuppet = [[Puppet alloc] initWithPuppetDelegate:self];
[puppets_ addObject:newPuppet];
}
- (void)puppetDidTwistStrings:(Puppet *)puppet
{
BOOL isOurPuppet = [puppets_ containsObject:puppet];
if (!isOurPuppet) return;
[puppet unravelStrings];
}
@end
Этот пример (по общему признанию) немного глуп, но этот код утечет, и ARC не поможет вам в этом, тогда как сборка мусора:
- У MasterOfPuppets может быть много марионеток, которые он хранит в переменной экземпляра - пока все хорошо.
- У Puppet есть делегат, который собирается сообщить, запутаны ли его строки - и вот он начинается.
В то время как в коде, отличном от ARC, переменная экземпляра была просто указателем, который был назначен, ARC предполагает, что если вы храните что-то в переменной, вы хотите за нее цепляться, и она будет retain
значение, если только Вы Скажите это не.
Итак, у вас есть классический цикл сохранения, и ARC не спасет вас от них.
Это может показаться надуманным и надуманным примером, но это не так: я довольно часто видел это в отношениях делегатов.
(Кстати, решение довольно простое: объявите Puppet
переменную экземпляра *1035* как weak
и все будет работать как надо.)