Dip*_*ika 6 memory-management properties objective-c ios
我知道强和弱是属性声明中使用的修饰符,而__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
Run Code Online (Sandbox Code Playgroud)
以下是生成的日志
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. ——??
Run Code Online (Sandbox Code Playgroud)
两个弱实例变量在它们弱引用的对象之后打印(null),设置为nil并且这是预期的但我想知道为什么弱属性weakStringProperty和weakArrayProperty仍然打印它们的先前值并且表现得像它们强烈指向strongStringProperty和strongArrayProperty分别?? ??
谢谢 :)
weakStringProperty并不是nil因为它的基金会仍然保留着它。
当您致电 时[[NSString alloc]initWithFormat:@"Property"],基金会决定将该字符串保留为 a,NSTaggedPointerString然后保留以供将来使用。您可以通过记录该类来验证这一点:
NSLog(@"kindof: %@", [self.weakStringProperty class]);
Run Code Online (Sandbox Code Playgroud)
我不确定系统使用什么标准来决定创建这些字符串,但长度和可变性是因素。以下任一操作都会得到您想要的结果。
// Longer string
self.strongStringProperty = [[NSString alloc]initWithFormat:@"Property la la la"];
// Mutable string
self.strongStringProperty = [[NSMutableString alloc]initWithFormat:@"Property"];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |