2011-01-08 97 views
4

Apple的Memory Management Programming Guide显示了三种用于编写需要保留或释放对象引用的访问器方法的官方认可技术。哪些内存管理技术在哪些情况下更好?

对于前两种技术(下面转载),Apple文档说“技术2的性能明显优于技术1,因为在吸气剂被调用的次数远多于设定者“。

// Technique 1 
- (NSString*) title 
{ 
    return [[title retain] autorelease]; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    if (title != newTitle) 
    { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 

// Technique 2 
- (NSString*) title 
{ 
    return title; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    [title autorelease]; 
    title = [newTitle retain]; // Or copy, depending on your needs. 
} 

这是技术1和技术2之间的唯一区别,还是使用了另一种具有的我可能需要知道其他微妙的后果?如果技术2使用性能更好的吸气剂,是否遵循该技术1使用性能更好的吸气剂,因为title获得了明确的(并且可能是立即的)释放?

回答

0

第二个getter很脆弱(如果有人访问对象的title然后释放该对象,它将会崩溃),所以第一个通常是优选的,即使速度稍慢。

第一个设置器效率更高,即使在自动释放池不存在的情况下也可以工作,所以它更可取。效率更高的原因不仅仅是因为autorelease和release - 如果你尝试将属性设置为现有值,它根本就不会做任何工作。

+0

如果dealloc方法适当地通过访问器清除变量,那么第二个技术不会导致崩溃因为标题将被自动释放,并且当新标题不同时,第二个二传手更快。但它的确使用了更多的内存,因为旧的标题并未立即发布。 – ughoavgfhw 2011-01-09 03:14:51

1

从2吸气和从1设定器:

- (NSString*) title 
{ 
    return title; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    if (title != newTitle) 
    { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 
相关问题