arasındaki davranış farkı Bir iPhone uygulamasında, UIView alt sınıfındaki tüm alt görünümleri kaldıran bir kod parçam var. Şun gibi görünüyor:UIView.subviews ve [NSView alt görünümleri]
NSArray* subViews = self.subviews;
for(UIView *aView in subViews) {
[aView removeFromSuperview];
}
Bu iyi çalışıyor.
NSArray* subViews = [self subviews];
for(NSView *aView in subViews) {
[aView removeFromSuperview];
}
tamamen çalışmaz: Neredeyse (bir NSView alt sınıf itibaren) Bir Mac OS X uygulamasında aynı şeyi denedik kadar Aslında, gerçekten hem çok düşünmediler. Özellikle, zamanında, bu alın:
*** Collection <NSCFArray: 0x1005208a0> was mutated while being enumerated.
ben şöyle yapıyor sona erdi: gayet
NSArray* subViews = [[self subviews] copy];
for(NSView *aView in subViews) {
[aView removeFromSuperview];
}
[subViews release];
. Beni rahatsız eden şey, neden iPhone'da çalışıyor? kopya niteliği belirtildiğinde
@property(nonatomic,readonly,copy) NSArray *subviews;
Benim ilk düşünce, belki @ synthesize'd getters bir kopyasını döndürür edildi:
subviews bir kopyası özelliktir. The doc, belirteçler için kopyanın semantiği konusunda nettir, ancak her iki şekilde de alıcılar için görünmüyor (veya en azından benim için belli değil). Ve aslında, kendi kendime bir kaç test yapıyorum, bu açıkça görülüyor. Hangisi iyi, sanırım bir kopyasını iade etmek birkaç sebepten dolayı sorunlu olurdu.
Soru şu: Yukarıdaki kod iPhone'da nasıl çalışıyor? NSView, gerçek bir alt görüntü dizisine açıkça bir işaretçi döndürüyor ve belki de UIView değil. Belki de sadece UIView'in bir uygulama detayıdır ve bu konuda çalışmadım.
Herhangi bir fikir sahibi olan var mı?
Güçbelâ bir hata @ Mike bu. [SomeUIView alt görünümü] bu dizinin kopyasını döndürürken yalnızca [someNSView alt görüntülemeleri] alt görüntü dizisine işaretçi döndürür. Bu yüzden iOS'ta iyi çalışıyor. – jackal