Dalla sperimentazione sembra che l'espressione della collezione venga valutata solo una volta. Considerate questo esempio:Obiettivo c "per ciascuna" (enumerazione rapida) - valutazione della raccolta?
static NSArray *a;
- (NSArray *)fcn
{
if (a == nil)
a = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
NSLog(@"called");
return a;
}
...
for (NSString *s in [self fcn])
NSLog(@"%@", s);
Il risultato è:
2010-10-07 07:37:31.419 WidePhotoViewer Lite[23694:207] called
2010-10-07 07:37:31.420 WidePhotoViewer Lite[23694:207] one
2010-10-07 07:37:31.425 WidePhotoViewer Lite[23694:207] two
2010-10-07 07:37:31.425 WidePhotoViewer Lite[23694:207] three
che indica che [sé fcn] viene chiamato solo una volta.
Qualcuno può confermare che questo è il comportamento specificato (rispetto al solo osservato)?
Quello che ho in mente è fare qualcosa di simile:
for (UIView *v in [innerView subviews]) {
invece di questo:
NSArray *vs = [innerView subviews];
for (UIView *v in vs) {
Pensieri?
Grazie a quelli, esp. Shmurk, che ha cercato di rispondere ... questo fa davvero luce sull'argomento. (Il controllo di un'implementazione per chiarire una specifica è pericoloso. Comunque, l'avevo già fatto nel preparare la domanda.) –