为什么我们需要一个临时对象?

问题描述

| 正如我在许多示例中看​​到的那样,首先它们为临时对象分配内存,然后将同一对象分配给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];