2017-03-19 8 views
8

में एक्सटेंशन के साथ समस्या निम्न कोड स्निपेट है जो कक्षा एक्सटेंशन से संबंधित है। जो मैं करने की कोशिश कर रहा हूं वह आंतरिक आईडी नामक एक यादृच्छिक आईडी उत्पन्न करता है (जिसे बाद में प्रोग्राम द्वारा उपयोग किया जाता है) जो स्मृति में एन्क्रिप्टेड रूप में संग्रहीत होता है। यह कोड कोड में टिप्पणियों के रूप में वर्णित प्रत्येक कंपाइलर के लिए अलग-अलग त्रुटि संदेशों के साथ दोनों जीसीसी और क्लैंग (मैं विंडोज़ पर जीएनयूएसटीपी के माध्यम से उद्देश्य सी चला रहा हूं) के साथ संकलित करने में विफल रहता है।उद्देश्य-सी

कृपया ध्यान दें कि मुझे इस तथ्य से अवगत है कि विस्तार के उपयोग को अनदेखा करके और मुख्य @interface (यानी #import कथन के बाद) में विधियों और गुणों की घोषणा करके आसानी से हल किया जा सकता है। एक्सटेंशन के साथ जा रहे एकमात्र कारण यह है कि इस वर्ग को कुछ अन्य उप-वर्गों द्वारा विरासत में मिला है, जिसमें "आंतरिक आईडी" संपत्ति पहुंच योग्य नहीं होनी चाहिए।

# 
# Command script for clang 
# C:\GNUstep\msys\1.0\home\hecate\my\GNUmakefile 
# 

GNUSTEP_MAKEFILES=/GNUStep/System/Library/Makefiles 

include $(GNUSTEP_MAKEFILES)/common.make 

TOOL_NAME = fwdORM 

fwdORM_OBJC_FILES = fwdORM.m 
fwdORM_OBJCFLAGS = -std=c99 

# Implementation mixing Objective-C/CPP file going to be compiled; Currently not required 
#fwdORM_OBJCC_FILES = fwdORM_21.mm 

# Implementation CPP file going to be compiled; Currently N/A 
#fwdORM_CC_FILES = sec_class_exec.cpp 

# Header files of project 
#fwdORM_HEADER_FILES = .h // N/A 

# Define compilation flags 
ADDITIONAL_CPPFLAGS = -Wall -Wno-import -fblocks 

# Include rules for creating a command line tool for Objective-C 
include $(GNUSTEP_MAKEFILES)/tool.make 

अग्रिम धन्यवाद:

#import <Foundation/Foundation.h> 

@interface Foo : NSObject 
{ 
    NSString * idStr; 
} 
- (void)setInternalID; 
- (NSString *)fetchExternalID; 
@end 

// Extension declaration 
@interface Foo() 
{ // Compilation via gcc throws error at this line stating "Expected identifier or '(' before '{' token" 
    NSString *internalID; // Compilation via clang throws error at this line stating "instance variables may not be placed in class extension" 
} 
@end 

@implementation Foo 
- (void)setInternalID{ 
    internalID = [NSString stringWithFormat: 
    @"__KEY__INTERNAL__DUMP2872167841398551___8765%d98KLPYFGF(&^$#ESFK___JNHGV",arc4random()%100]; 
} 
- (NSString *)fetchExternalID{ 
    NSString * externalID=[internalID stringByReplacingOccurrencesOfString: 
    @"__KEY__INTERNAL__DUMP2872167841398551___8765" withString:@""]; 
    externalID=[externalID stringByReplacingOccurrencesOfString: 
    @"98KLPYFGF(&^$#ESFK___JNHGV" withString:@""]; 
    return externalID; 
} 
@end 

int main(int argc, const char * argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    Foo * bar = [[Foo alloc]init]; 
    [bar setInternalID]; 
    NSLog(@"External ID: %@",[bar fetchExternalID]);   
    [pool drain]; 
    return 0; 
} 

जीसीसी मैं उपयोग कर रहा हूँ के लिए संकलन स्ट्रिंग बजना के लिए इस प्रकार है gcc -o _exec fwdORM.m -I /GNUstep/System/Library/Headers -L /GNUstep/System/Library/Libraries -lobjc -lgnustep-base -fconstant-string-class=NSConstantString

मेरे GNUmakefile है।

+0

मैं क्लैंग/मैक ओएस के साथ त्रुटि को पुन: उत्पन्न नहीं कर सकता। हालांकि, अपने लक्ष्य तक पहुंचने के लिए, ivar को '@ कार्यान्वयन' पर परिभाषित करना बेहतर है। –

+0

@ AminNegm-Awad अरे, क्या आप इसे हल करने के लिए अपने अनुशंसित तरीके से थोड़ा अधिक विशिष्ट हो सकते हैं? क्योंकि जो मुझे पता है, उसके अनुसार, सभी ivars को '@interface' में रखा जाना चाहिए। और जब आप कहते हैं कि आपको क्लैंग/मैक ओएस में कोई त्रुटि नहीं है, तो क्या आपने उसी जीएनयूमेकफाइल को लागू किया था? मुझे नहीं लगता कि कोड मैक ओएस में संकलित करने के लिए संभव है और जीएनयूएसटीपी/विंडोज़ में विफल हो सकता है। देर से उत्तर के लिए खेद है। मैं प्रोजेक्ट के दूसरे हिस्से में बहुत गड़बड़ था :) – hecate

+0

नहीं, मैंने इसे बिना मेकफ़ाइल के किया था। यह सच नहीं है कि आईवर को 'इंटरफ़ेस' अनुभाग में परिभाषित किया जाना चाहिए। आप '@ कार्यान्वयन' पर एक ही काम कर सकते हैं। –

उत्तर

4

एक @property एक इवर के बजाय वर्ग विस्तार में घोषित उपयोग करके इस को लागू करने का प्रयास करें:

#import <Foundation/Foundation.h> 

@interface Foo : NSObject 
- (void)setInternalID; 
- (NSString *)fetchExternalID; 
@end 

// Extension declaration 
@interface Foo() 
@property (strong) NSString *internalID; 
@end 

@implementation Foo 

- (void)setInternalID { 
    self.internalID = [NSString stringWithFormat:@"__KEY__INTERNAL__DUMP2872167841398551___8765%d98KLPYFGF(&^$#ESFK___JNHGV",arc4random()%100]; 
} 

- (NSString *)fetchExternalID { 
    NSString * externalID = [self.internalID stringByReplacingOccurrencesOfString:@"__KEY__INTERNAL__DUMP2872167841398551___8765" withString:@""]; 
    externalID = [externalID stringByReplacingOccurrencesOfString:@"98KLPYFGF(&^$#ESFK___JNHGV" withString:@""]; 
    return externalID; 
} 

@end 

यह वही है प्रभावी रूप से एक private चर है, और शायद संकलक समर्थन होने का एक बेहतर मौका खड़ा के लिए मानक अर्थ विज्ञान है।