2017-03-19 25 views
8

Aşağıdaki, sınıf uzantılarıyla ilgilenen bir kod snippet'idir. Yapmaya çalıştığım, bellekteki şifrelenmiş bir biçimde saklanan dahili ID (daha sonra program tarafından kullanılan) adı verilen rasgele bir kimlik oluşturmaktır. Kod, kodda yorum olarak belirtilen her bir derleyici için farklı hata iletileriyle gcc ve clang (Windows üzerinde GNUStep aracılığıyla Objective C çalıştırıyorum) ile derlenememektedir.Objective-C'deki uzantılarla ilgili sorun

Lütfen unutmayın, bu sorunun, uzantıların kullanımı göz ardı edilerek ve ana @interface'de (yani, #import ifadesinden sonraki) yöntem ve özelliklerin bildirilmesiyle kolayca çözülebileceğinin farkındayım. Uzantıları kullanmamın tek nedeni, bu sınıfın "internalID" özelliğinin erişilememesi gereken birkaç başka alt sınıf tarafından miras alındığıdır. peşin

# 
# 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 

Teşekkür:

#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; 
} 

kullanıyorum gcc için derleme dize clang aşağıdaki gibidir gcc -o _exec fwdORM.m -I /GNUstep/System/Library/Headers -L /GNUstep/System/Library/Libraries -lobjc -lgnustep-base -fconstant-string-class=NSConstantString

Benim GNUmakefile olduğunu. yerine Ivar sınıf uzantısı bildirilen bir @property kullanarak bu uygulamaya

+0

Hatayı clang/Mac OS ile yeniden oluşturamıyorum. Bununla birlikte, hedefinize ulaşmak için, ivar'ı '@ implementasyonda tanımlamak daha iyidir. –

+0

@ AminNegm-Awad Hey, bunu çözmek için önerilen yol üzerinde biraz daha spesifik olabilir misiniz? Çünkü bildiğim kadarıyla, bütün ivarlar '@interface' içine yerleştirilmelidir. Ve clang/Mac OS'de bir hata olmadığını söylediğinde, aynı GNU'yu uyguladınız mı? Kodun Mac OS'de derlenmesi ve GNUStep/Windows'da başarısız olmasının mümkün olduğunu düşünmüyorum. Geç cevap için özür dilerim. Projenin başka bir bölümünde oldukça şaşırdım :) – hecate

+0

Hayır, makefile olmadan yaptım. Bu, ivarların bir '@ interface' bölümünde tanımlanması gerektiği doğru değildir. Aynı şeyi '@' uygulamasında da yapabilirsiniz. –

cevap

4

Dene:

#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 

Bu etkin bir private değişken olduğunu ve muhtemelen derleyici desteği alma şansının yüksek olduğuna ne için standart semantik.