2010-03-28 4 views
12

मैं कुछ परेशानी एक विधि के लिए एक तर्क के रूप में एक संख्या गुजर रही:Int या NSInteger। ऑब्जेक्टिव-सी

- (void)meth2:(int)next_int; 

और वह विधि मैं इस की जरूरत है कॉल करने के लिए: इस बिंदु पर

int next_int = 1; 
[self performSelectorOnMainThread:@selector(meth2:) withObject:next_int waitUntilDone:NO]; 
//update next_int and call meth2 again 

, मैं एक "बिना किसी कलाकार के पूर्णांक से सूचक" त्रुटि और NSInteger के साथ ऐसा ही होगा। एक NSNumber उपयोगी नहीं है क्योंकि यह अपरिवर्तनीय है और मुझे लगातार मूल्य बदलने की आवश्यकता है। कोई विचार मैं यह कैसे कर सकता हूं?

धन्यवाद।

उत्तर

22

तुम सिर्फ विधि कॉल करने के प्रयास कर रहे हैं , आप मानक सिंटैक्स का उपयोग कर सकते हैं:

[self meth2:next_int]; 

तुम सच मेंउपयोग करने के लिए की जरूरत है 0 आप कॉल के लिए NSNumber में संख्या को लपेट सकते हैं। आप कहते हैं कि आप ऐसा नहीं कर सकते क्योंकि आप नंबर बदलने की जरूरत है, लेकिन आप केवल एक पूर्णांक बाहर निकालते हैं और है कि बदल सकते हैं:

[self performSelectorOnMainThread:@selector(meth2:) withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO]; 
// ... later ... 
- (void)meth2:(NSNumber *)number { 
    int myInt = [number intValue]; 
    // do stuff with myInt 
} 

लेकिन हो सकता है आप का मतलब है कि आप के रूप में संख्या के मूल्य प्राप्त करना चाहते हैं आपके कॉल से आउटपुट meth2 पर। यदि यह तुम क्या मतलब है, तो आप एक डबल सूचक पास कर सकता है ताकि आप वापस एक नई वस्तु प्राप्त कर सकते हैं:

- (void)meth2:(NSNumber **)number { 
    int myInt = [*number intValue]; 
    // do stuff with myInt 
    *number = [NSNumber numberWithInt:myInt]; 
} 
// The caller can now operate like this: 
NSNumber *number = [NSNumber numberWithInt:next_int]; 
[self performSelectorOnMainThread:@selector(meth2:) withObject:&number waitUntilDone:YES]; 
int returnInt = [*number intValue]; 
बेशक

, जो वास्तव में धागे की सुरक्षित नहीं है, इसलिए यदि आप एक से अधिक थ्रेड के साथ सामान कर रहे हैं , मैं बहु-थ्रेड-एक्सेस किए गए चरों तक पहुंचने के लिए @synchronized कीवर्ड का उपयोग करने की सलाह दूंगा, या परमाणु गुणों को स्थापित कर सकता हूं (यानी गुण nonatomic के रूप में घोषित नहीं किए गए हैं)।

इसके अलावा, मेथ आपके लिए बुरा है !! haha

+0

हाय टायलर लेने के लिए विधि हस्ताक्षर को संशोधित करने की आवश्यकता है, मुझे @ सिंक्रनाइज़ किए गए कीवर्ड के बारे में निश्चित नहीं है, मैं इसके बारे में पढ़ूंगा, लेकिन इसके बाद से पूर्णांक चर का उपयोग थ्रेड से 'आउटपुट' के रूप में किया जाता है, जिसमें समवर्तीता और सामान के बारे में चिंता करने की आवश्यकता नहीं होती है। ..withObject: [NSNumber numberWithInt: next_int] .. बहुत अच्छा काम करता है, (NSNumber **) मुझे एक असंगत सूचक प्रकार चेतावनी देता है। मैं ध्यान रखूंगा कि मेथ के बारे में ... धन्यवाद! – sergiobuj

2

आप next_int का उपयोग withObject: के रूप में नहीं कर सकते क्योंकि यह कोई ऑब्जेक्ट नहीं है।

[self performSelectorOnMainThread:@selector(meth2:) 
     withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO]; 

संपादित करें:

करने के लिए अपने कॉल बदलें और meth2 बदलने एक int के बजाय एक NSNumber अपेक्षा करनी चाहिए।

+1

इससे रन-टाइम क्रैश हो जाएगा क्योंकि आपको 'NSNumber' –

6

लपेटें इसे पारित करने से पहले एक NSNumber में पूर्णांक:

int next_int = 1 
NSNumber *theNumber = [NSNumber numberWithInt:next_int]; 
[self performSelectorOnMainThread:@selector(meth2:) withObject:theNumber waitUntilDone:NO]; 

फिर अपने -meth2: विधि कुछ इस तरह दिखाई दे सकता है:

- (void)meth2:(NSNumber*)theNumber 
{ 
    int next_int = [theNumber intValue]; 
    // do whatever 
} 
3

यह एक हैक का एक सा है, लेकिन इस एआरसी के तहत काम करता है:

int next_int = 1; 
[self performSelectorOnMainThread:@selector(meth2:) 
         withObject:(__bridge id)(void*)next_int 
        waitUntilDone:NO]; 

__bridge कीवर्ड संकलक बताओ, एआरसी के तहत संदर्भ गिनती की अनदेखी करने, लेकिन यह एक सूचक की आवश्यकता होगी तो आपके द्वारा पहली एक सी शैली शून्य पॉइंटर के लिए int डालना है। जब आपकी विधि संदेश प्राप्त करती है तो वह उस ऑब्जेक्ट पॉइंटर का इलाज करेगी जैसे कि यह एक पूर्णांक है।

नोट: यदि आप एक पूर्णांक के बजाय NSNumber लेने के लिए विधि को बदल सकते हैं, तो यह "उचित" फ़िक्स होगा। दुर्भाग्य से यह हमेशा संभव नहीं है।

+0

यह एक अच्छी चाल है यदि आप एक enum पास करना चाहते हैं, जैसे कि enum संपत्ति सेट करते समय; उदाहरण के लिए '[सेल प्रदर्शन चयनकर्ता: @ चयनकर्ता (setSortOrder :) ऑब्जेक्ट के साथ: (__ ब्रिज आईडी) (शून्य *) ऑर्डर]; ' – tiritea