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
Hatayı clang/Mac OS ile yeniden oluşturamıyorum. Bununla birlikte, hedefinize ulaşmak için, ivar'ı '@ implementasyonda tanımlamak daha iyidir. –
@ 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
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. –