Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios OC设置器方法_Ios_Setter - Fatal编程技术网

Ios OC设置器方法

Ios OC设置器方法,ios,setter,Ios,Setter,这里有两种更好的方法?我不明白 谢谢大家! - (void)setName:(NSString *)name { //one way [_name release]; [name retain]; _name = name; //another way //[_name autorelease]; //_name = [name retain]; } 结果是一样的,但从性能和多线程的角度来看,第一个更好 自动释放池将占用一些额外的资源,

这里有两种更好的方法?我不明白

谢谢大家!

- (void)setName:(NSString *)name
{
    //one way
    [_name release];
    [name retain];
    _name = name;

    //another way
    //[_name autorelease];
    //_name = [name retain];
}

结果是一样的,但从性能和多线程的角度来看,第一个更好

自动释放池将占用一些额外的资源,将对象放在某个堆栈上,该堆栈在下一个线程周期中调用release。如果您在其他主线程中使用此选项,则还需要创建自动释放池,否则对象将泄漏

自动释放在某些getter方法中非常有用,在这些方法中,您可以创建返回的对象,以确保它在一段时间后释放,而不是在运行中释放,因为您可能需要延长其生命周期:

- (NSObject *)generateObject {
    //good
    return [[[NSObject alloc] init] autorelease];

    //will be deallocated on the fly
    NSObject *toReturn = [NSObject alloc] init];
    [toReturn release];
    return toReturn;
}
第二种方法将在调用release时立即释放对象,这意味着该方法是无用的。第一种方法将起作用,通过使用
object=[[self-generateObject]retain]
您将重新获得该对象的所有权,并且在调用另一个
release
autorelease
之前不会解除分配。请注意,如果对象的生存期比线程周期短,则不需要重新获取所有权,这意味着如果您不将其作为对象中的某个参数传递,该参数稍后将使用它,或者在其他线程上使用它,则不需要重新获取所有权

对于使用循环之类的场景,您应该知道这一区别:如果您使用
[UIImage imageWithContentsOfFile://code>迭代100个图像,您的应用程序很可能会由于大量内存消耗而被终止,因为所有100个图像都将在循环结束时存储在内存中,因为它们正在被自动删除。另一方面,使用
[[[UIImage alloc]initWithContentsOfFile:]release]
将动态取消分配图像数据,并按预期工作

因此,一般来说,我建议您仅在没有其他方法时才使用
自动释放。如果可能,尝试在飞行中释放对象

- (NSObject *)generateObject {
    //good
    return [[[NSObject alloc] init] autorelease];

    //will be deallocated on the fly
    NSObject *toReturn = [NSObject alloc] init];
    [toReturn release];
    return toReturn;
}