问题描述
|
正如我在许多示例中看到的那样,首先它们为临时对象分配内存,然后将同一对象分配给self。例如,我在这里有一个代码段:
-(void)viewDidLoad {
[super viewDidLoad];
Movie *newMovie = [[[Movie alloc] initWithTitle:@\"Iron Man\"
BoxOfficeGross:[NSNumber numberWithFloat:650000000.00]
summary:@\"Smart guy makes cool armor\"] autorelease];
self.movie = newMovie;
}
为什么我们不能像这样执行:
self.movie =[[[Movie alloc] initWithTitle:@\"Iron Man\"
BoxOfficeGross:[NSNumber numberWithFloat:650000000.00]
summary:@\"Smart guy makes cool armor\"] autorelease];
解决方法
两者基本相同。他们遵守所有权条款–您释放创建/保留的内容。区别(虽然在这里不是很明显)是释放自动释放对象所花费的时间。说,如果这种自动释放对象的负载在内存中徘徊,则可能会导致内存问题。如果我们释放了它们,并且它们的保留计数为零,那么它们将立即被释放并释放内存。
,您不需要临时对象。您的建议完全正确。
,但是,如果您需要在创建对象后设置属性或调用方法,则使用临时对象可能比多次调用
self.movie
好一点:
Movie *newMovie = [[[Movie alloc] initWithTitle:@\"Iron Man\" boxOfficeGross:[NSNumber numberWithFloat:650000000.00] summary:@\"Smart guy makes cool armor\" ] autorelease];
newMovie.rating = 4;
[newMovie fetchImageFromServer];
self.movie = newMovie;
就个人而言,在这种情况下,我不会使用ѭ4,但这更多是一种样式首选项:
Movie *newMovie = [[Movie alloc] initWithTitle:@\"Iron Man\" boxOfficeGross:[NSNumber numberWithFloat:650000000.00] summary:@\"Smart guy makes cool armor\" ];
newMovie.rating = 4;
[newMovie fetchImageFromServer];
self.movie = newMovie;
[newMovie release];