के बीच व्यवहार अंतर मेरे पास एक आईफोन ऐप में कोड का एक टुकड़ा है, जो UIView सबक्लास से सभी सबव्यूव को हटा देता है। ऐसा लगता है:UIView.subviews और [NSView सबव्यूज़]
NSArray* subViews = self.subviews;
for(UIView *aView in subViews) {
[aView removeFromSuperview];
}
यह ठीक काम करता है। वास्तव में, मैं वास्तव में कभी नहीं सोचा था कि यह बहुत दे दी है जब तक मैं लगभग (एक NSView उपवर्ग से) एक मैक ओएस एक्स अनुप्रयोग में एक ही बात करने की कोशिश की:
NSArray* subViews = [self subviews];
for(NSView *aView in subViews) {
[aView removeFromSuperview];
}
कि पूरी तरह से काम नहीं करता। विशेष रूप से, क्रम में, मैं इस मिल:
*** Collection <NSCFArray: 0x1005208a0> was mutated while being enumerated.
मैं इतना है कि यह कर समाप्त हो गया:
NSArray* subViews = [[self subviews] copy];
for(NSView *aView in subViews) {
[aView removeFromSuperview];
}
[subViews release];
यही ठीक है। मुझे क्या परेशान कर रहा है, हालांकि, यह आईफोन पर क्यों काम करता है?
@property(nonatomic,readonly,copy) NSArray *subviews;
मेरी पहली सोचा था, हो सकता है @ synthesize'd ही टिककर खेल एक प्रति लौटने जब प्रतिलिपि विशेषता निर्दिष्ट किया जाता है:
subviews एक प्रति संपत्ति है। The doc सेटर्स के लिए प्रतिलिपि के अर्थशास्त्र पर स्पष्ट है, लेकिन गेटर्स के लिए कोई रास्ता नहीं दिखता है (या कम से कम, यह मेरे लिए स्पष्ट नहीं है)। और वास्तव में, मेरे अपने कुछ परीक्षण कर रहे हैं, यह स्पष्ट रूप से मामला प्रतीत नहीं होता है। जो अच्छा है, मुझे लगता है कि एक प्रतिलिपि कुछ कारणों से समस्याग्रस्त हो जाएगी।
तो सवाल यह है कि उपरोक्त कोड आईफोन पर कैसे काम करता है? NSView स्पष्ट रूप से सबव्यूज़ की वास्तविक सरणी में एक सूचक लौटा रहा है, और शायद UIView नहीं है। शायद यह केवल UIView का कार्यान्वयन विवरण है, और मुझे इसके बारे में काम नहीं करना चाहिए।
क्या कोई भी अंतर्दृष्टि प्रदान कर सकता है?
यह मुश्किल से एक बग @Mike है। यह सिर्फ [someNSView सबव्यूव्यू] सबव्यूज़ की सरणी में पॉइंटर लौटाता है, जबकि [someUIView सबव्यूज़] उस सरणी की प्रति देता है। यही कारण है कि यह आईओएस पर ठीक काम करता है। – jackal