2016-12-14 5 views
0

Мой английский не очень хорошо, я пытаюсь четко описать проблему. Я знаю, что @property и @synthesize предназначены только для получения методов получения и сеттера. Таким образом, мы можем использовать имущество по self.x и _x. И self.x - это просто метод setter и getter.Какая польза от @property (strong) в OC?

Результат @property(strong) это получить методы следующим образом: Все в АРК:

@property (nonatomic, strong) NSString *name; 

- (NSString *)name { 
    return _name; 
} 

- (void)setName:(NSString *)name { 
    if (_name != name) { 
    _name = name; 
    } 
} 

Итак, мой вопрос в том, что если использование @property(strong) просто получить методы, мы можем использовать следующие ,

- (void)setName:(NSString *)name { 
    if (_name != name) { 
    __weak _name = name; 
    } 
} 

Когда мы используем self.namesetName: установить вызов метода, и мы получаем слабое имя, даже мы используем сильный прежде, это выглядит правильно. Но есть и другие примеры.

@protocol TestDelegate <NSObject> 
@end 

@interface Test : UIView 

@property (nonatomic, weak) id<TestDelegate> delegate; 

- (instancetype)initWithDelegate:(id<TestDelegate>)delegate; 

@end 

- (instancetype)initWithDelegate:(id<TestDelegate>)delegate { 
    self = [super init]; 
    if (self) { 
    _delegate = delegate; 
    } 
    return self; 
} 

Использование в ViewController, все dealloc, не рецикл. Затем мы используем

@property (nonatomic, strong) id<TestDelegate> delegate; 

- (instancetype)initWithDelegate:(id<TestDelegate>)delegate { 
    self = [super init]; 
    if (self) { 
    self.delegate = delegate; 
    } 
    return self; 
} 

- (void)setDelegate:(id<TestDelegate>)delegate { 
    __weak _delegate = delegate; 
} 

Все dealloc, не перерабатывают. Поскольку мы используем self.delegate в методе init, вызов метода setDelegate:, и мы получаем слабый делегат, даже раньше мы использовали сильные. Затем мы используем _delegate = delegate, он будет перерабатывать !!! Меня озадачивает, что мы используем weak и _delegate = delegate, он работает хорошо, но мы используем strong, _delegate = delegate и пользовательский метод слабых меток, он перерабатывается.

Спасибо!

ответ

0

Делегаты должны быть слабыми типами свойств. Это позволит избежать сохранения цикла, потому что между ними может быть бесконечный круг сохранения двух объектов. С использованием ARC это пример использования делегата: @property (nonatomic, weak) id <MyObjectDelegate> delegate;

+0

ну, спасибо, я сказал это! Я не хочу получить ответ, что делегаты должны должны использовать слабый! Я имею в виду, как слабые понимают, если просто получают как геттер, так и сеттер, а слабый действуют в сеттер.Почему мы используем '' '_delegate = delegate''' хорошо! – swordjoy

Смежные вопросы