Я знаю, что сильные и слабые модификаторы используются в объявлениях свойств, в то время как __strong и __weak используются в объявлениях переменных экземпляра ... strong говорит, что держать объект в памяти дольше как им владеют, и слабый говорит, что держать объект в памяти, пока кто-то еще имеет сильную ссылку на него ... правильно? но я не понимаю, почему слабый для свойства и __weak, например, переменная ведет себя по-другому? Вот что я задавался вопросом ...почему слабый для свойства и __weak, например, переменная ведет себя по-разному
@interface DemoViewController(){
__weak NSArray *weakArray;
__strong NSArray *strongArray;
__weak NSString *weakString;
__strong NSString *strongString;
}
@property (weak) NSString *weakStringProperty;
@property (strong) NSString *strongStringProperty;
@property (weak) NSArray *weakArrayProperty;
@property (strong) NSArray *strongArrayProperty;
@end
@implementation DemoViewController
- (void)viewDidLoad {
[super viewDidLoad];
strongArray = [[NSArray alloc] initWithObjects:@"one",@"two", nil];
weakArray = strongArray;
NSLog(@"Round:1 strongArray is %@.", strongArray);
NSLog(@"Round:1 weakArray is %@.", weakArray);
strongArray = nil;
NSLog(@"Round:2 strongArray is %@.", strongArray);
NSLog(@"Round:2 weakArray is %@.", weakArray);
self.strongArrayProperty = [[NSArray alloc] initWithObjects:@"one",@"two", nil];
self.weakArrayProperty = self.strongArrayProperty;
NSLog(@"Round:1 strongArrayProperty is %@.", self.strongArrayProperty);
NSLog(@"Round:1 weakArrayProperty is %@.", self.weakArrayProperty);
self.strongArrayProperty = nil;
NSLog(@"Round:2 strongArrayProperty is %@.", self.strongArrayProperty);
NSLog(@"Round:2 weakArrayProperty is %@.", self.weakArrayProperty);
strongString = [[NSString alloc]initWithFormat:@"instanceVariable"];
weakString = strongString;
NSLog(@"Round:1 strongString is %@.", strongString);
NSLog(@"Round:1 weakString is %@.", weakString);
strongString = nil;
NSLog(@"Round:2 strongString is %@.", strongString);
NSLog(@"Round:2 weakString is %@.", weakString);
self.strongStringProperty = [[NSString alloc]initWithFormat:@"Property"];
self.weakStringProperty = self.strongStringProperty;
NSLog(@"Round:1 strongStringProperty is %@.", self.strongStringProperty);
NSLog(@"Round:1 weakStringProperty is %@.", self.weakStringProperty);
self.strongStringProperty = nil;
NSLog(@"Round:2 strongStringProperty is %@.", self.strongStringProperty);
NSLog(@"Round:2 weakStringProperty is %@.", self.weakStringProperty);
}
@end
И вот приведенные журналы
Round:1 strongArray is (
one,
two
).
Round:1 weakArray is (
one,
two
).
Round:2 strongArray is (null).
Round:2 weakArray is (null).
Round:1 strongArrayProperty is (
one,
two
).
Round:1 weakArrayProperty is (
one,
two
).
Round:2 strongArrayProperty is (null).
Round:2 weakArrayProperty is (
one,
two
). —???
Round:1 strongString is instanceVariable.
Round:1 weakString is instanceVariable.
Round:2 strongString is (null).
Round:2 weakString is (null).
Round:1 strongStringProperty is Property.
Round:1 weakStringProperty is Property.
Round:2 strongStringProperty is (null).
Round:2 weakStringProperty is Property. ——??
Оба слабые переменные экземпляра печати (нуль) после объектов они были слабо со ссылкой, устанавливаются в ноль и это как и ожидалось, но им интересно, почему и слабые свойства weakStringProperty и weakArrayProperty все еще печатают свои предыдущие значения и ведут себя так, как будто они явно указывают на strongStringProperty и strongArrayProperty соответственно?
Спасибо :)
Я могу получить strongArrayProperty и weakArrayProperty как (null) в раунде 2. Хотя, weakStringProperty в раунде 2 по-прежнему «Свойство». Это очень странно, поскольку ARC должна технически справиться с этим. PS-Я запустил это на своем компьютере. –
Я думаю, причина в том, что слабое свойство сохраняется, так как основной метод имеет пул автозапуска, который включает приложение. Из-за пула авторефератов слабое свойство сразу не устанавливается на нуль. Хотя, я попытался получить доступ к нему в viewDidAppear и didReceiveMemoryWarning (путем моделирования предупреждения о памяти), он все равно не стал ник. –
странно !! когда я запускаю этот код на реальном устройстве, он дал ожидаемые результаты как для слабых переменных экземпляра, так и для слабых свойств ... это означает, что проблема связана только с симуляторами.Anyways Thxs @Kunal Shrivastava – Dipika