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

时间:2011-05-23 08:30:25

标签: iphone objective-c

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

3 个答案:

答案 0 :(得分:3)

两者基本相同。他们遵守所有权条款 - 您释放创建/保留的内容。虽然在这里不太明显,但差异在于释放自动释放对象所需的时间。比如,如果这些自动释放的对象在内存中徘徊,这可能会造成内存问题。如果我们释放它们并且它们的保留计数为零,它们会立即被释放并释放内存。

答案 1 :(得分:2)

您不需要临时对象。你的建议完全有效。

答案 2 :(得分:0)

但是,如果您需要在创建对象后设置属性或调用方法,则使用临时对象可能比多次调用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;

就个人而言,在这种情况下我不使用autorelease,但这更像是一种风格偏好:

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];