Ну, уже есть три ответа, которые охватывают основные вещи, поэтому я остановлюсь на одной детали здесь, что уже не упоминаются:
3.) Я не нашел инструмент «Утечки» в 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 может быть много кукол, которые он хранит в переменной экземпляра - пока это так хорошо.
- A Puppet имеет делегата, который собирается сообщить, запутаны ли его строки - и вот он начинается.
Если в не-ARC кода переменной экземпляра просто указатель, который был быть назначен, ARC предполагает, что если вы копить что-то в переменной, вы хотите, чтобы цепляться за нее, и она будет retain
значение, если только вы скажите это не.
Итак, у вас есть классический цикл удержания здесь, и ARC не спасет вас от этого.
Это может показаться надуманным и надуманным примером, но это не так: я видел это довольно много в отношениях делегатов.
(Решение, кстати, довольно просто: объявить переменную delegate_
экземпляра Puppet
«s, как weak
и все работает как надо.)
Пожалуйста отправьте их как отдельные вопросы. – Jim
Я думаю, что все они связаны. – sharon
Ответ Тима очень хороший, но вы все равно должны прочитать документацию для своей собственной выгоды. –