実行時にプロパティの実装方法を追加したいと思います。追加私は+ resolveInstanceMethod、class_addMethodを使用します。しかし、dynamicN()とdynamicSetN()のコードの下ではコンパイルできず、合成プロパティなしでインスタンス変数を設定/取得するためのC-Functionの使い方がわかりません。動的プロパティgetter/setterの生成方法は?
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
float dynamicN(id self, SEL _cmd)
{
NSString *methodName = NSStringFromSelector(_cmd);
NSLog(@"%@,%@", methodName, [self description]);
// return [self n];
}
void dynamicSetN(id self, SEL _cmd, float sname)
{
printf("setName start;\n");
// self.n = sname;
}
@interface bird : NSObject
{
int height;
float n;
}
@property float n;
@property int height;
@end
@implementation bird
@synthesize height = height;
@dynamic n;
- (id)init
{
if (self = [super init]) {
n = 1.0;
height = 3;
}
return self;
}
- (float) n {
return n;
}
+ (BOOL) resolveInstanceMethod:(SEL)aSEL
{
if (aSEL == @selector(n)) {
//class_addMethod([self class], aSEL, (IMP) dynamicN, "[email protected]:");
//return YES;
}
if (aSEL == @selector(setN:)) {
class_addMethod([self class], aSEL, (IMP) dynamicSetN, "[email protected]:f");
return YES;
}
return [super resolveInstanceMethod:aSEL];
}
@end
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
bird *aBird = [[bird alloc] init];
aBird.n = 3;
printf("\n%f\n,%d", aBird.n, aBird.height);
[pool drain];
return 0;
}
コンパイラからのエラーメッセージを追加してください。 –