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