如何使用@synthesize实现retain setter?

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.

  • 最初,值为nil,并且将任何消息发送到nil(包括retain/release)是no op返回nil. (2认同)