ma1*_*w28 5 iphone memory-management properties objective-c retain
我在标题中有以下内容:
@property (nonatomic, retain) UIView *overlay;
Run Code Online (Sandbox Code Playgroud)
并在实施中:
@synthesize overlay;
Run Code Online (Sandbox Code Playgroud)
然后:
UIView *tempOverlay = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 70.0f, 150.0f, 310.0f)];
self.overlay = tempOverlay;
[tempOverlay release];
Run Code Online (Sandbox Code Playgroud)
tempOverlay上面的变量不是不必要的吗?我不能这样做:
self.overlay = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 70.0f, 150.0f, 310.0f)];
Run Code Online (Sandbox Code Playgroud)
jv4*_*v42 11
合成的保留setter看起来像:
- (void)setValue: (id)newValue
{
if (value != newValue)
{
[value release];
value = newValue;
[value retain];
}
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您有两个有效的方法:
1)创建temp var,alloc/init(= retain),设置为property,release.
IView *tempOverlay = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 70.0f, 150.0f, 310.0f)];
self.overlay = tempOverlay;
[tempOverlay release];
Run Code Online (Sandbox Code Playgroud)
2)没有临时变量,直接设置为ivar.
overlay = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 70.0f, 150.0f, 310.0f)];
Run Code Online (Sandbox Code Playgroud)
更新:如果使用方法2),则必须通过释放之前可能具有的任何先前值(如果需要)来显式处理剩余的内存管理(不仅仅是保留).如果只进行一次init(例如),你可以把一个[overlay release];在dealloc.