Med*_*eda 4 iphone objective-c ipad ios automatic-ref-counting
在下面的代码中,self被保留以确保在调用块时图像对象存在.这就是文档所说的.但是,我似乎不明白为什么.简单地保留图像可以保证它不会被解除分配.那么为什么要保住自己呢?
self.finishBlock = ^{
self.image.hidden = YES;
}
Run Code Online (Sandbox Code Playgroud)
如果您直接访问图像,这是否适用?
self.finishBlock = ^{
_image.hidden = YES;
}
Run Code Online (Sandbox Code Playgroud)
自我被保留,因为
self.image.hidden = YES;
Run Code Online (Sandbox Code Playgroud)
实际上是
[[self image] setHidden:YES];
Run Code Online (Sandbox Code Playgroud)
图像不能/不能直接保留,因为在执行块之前它不可用并且[self image]被调用以获得图像.
你的第二个例子也保留了自我,但原因略有不同.在Objective-C中,当您直接访问实例变量时,它实际上是通过self的底层结构访问的.所以,_image实际上是self->_image在编译之后.同样,该块需要访问self,因此它保留了self.
另外值得注意的是,在任何一种情况下,如果_image的值在执行块之前发生变化,则块将"看到"新值.这通常是,但并不总是你想要的.
你有两种方法可以避免自我保留.第一个将执行此操作并将在定义块时捕获_image的值,因此即使它发生更改,块也将看到原始值.这种方法是定义一个局部变量,将其设置为返回的当前值self.image,然后在块中使用它:
UIImage *image = self.image;
self.finishBlock = ^{
image.hidden = YES;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是捕获弱版本的self并在块中使用它.在这种情况下,块将具有弱 - 而不是强 - 对自我的引用(即,不会保留自己).但是,-image仍然会调用self上的访问器方法,因此如果在块运行之前更改了图像,则将使用新值:
__weak YourClass *weakSelf = self;
self.finishBlock = ^{
weakSelf.image.hidden = YES;
}
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,如果self在块运行之前取消分配,则为weakSelfnil,并且块中的语句实际上将是NOOP(消息发送到nil不会在Objective-C中执行任何操作).
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |