4

Objective-Cの新機能、

#import <objc/objc.h>
#import <Foundation/Foundation.h>

@interface Test:NSObject
{
  int x,y, abc;
  NSString *v1, *v2;
}
@property int x , y, abc;
-(void) print;

@end

@implementation Test
@synthesize x,y, abc;
-(void) print
{
 NSLog (@"v1 and v2 values %i, %i ", v1, v2);
}

@end

int main ( int argc, char **argv)

{
  Test *t = [[Test alloc] init];
  /* Synthesized Set Method */
  [t setX:100];
  [t setY:200];
 /* Synthesized Get Method */
  NSLog (@"Retrieving Values %i, %i ",[t x], [t y]);

 /* another Way to retrieve the throuhg KVC Model */
 NSLog (@" KVC Retrieveal  %i ", [t valueForKey:@"x"]);

}

コンパイル時エラーは発生しませんでしたが、実行時エラーが発生しました:

2012-04-11 16:25:08.470 testpgm[22237] Retrieving Values 100, 200 
2012-04-11 16:25:08.513 testpgm[22237] autorelease called without pool for object (0x8e78ca0) of class NSMethodSignature in thread <NSThread: 0x8e23a08>
2012-04-11 16:25:08.514 testpgm[22237] autorelease called without pool for object (0x8e94610) of class NSIntNumber in thread <NSThread: 0x8e23a08>
2012-04-11 16:25:08.514 testpgm[22237]  KVC Retrieveal  149505552 

メモリの問題と関係があるようです。誰かが問題を指摘しますか?

注:すべての入力で、自動リリースの問題を解決できましたが、それでも

NSLog (@" KVC Retrieveal  %i ", [t valueForKey:@"x"]);

適切な値ではなく、ガベージを出力します。私は何か間違ったことをしていますか?

4

4 に答える 4

6

アプリケーションの実行ループにいるときは、デフォルトの自動解放プールが作成されます。ただし、独自ので実行している場合はmain、の上部に手動で自動解放プールを作成し、main定期的に排出する必要があります。

NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
// Your code that uses autorelease...
[myPool drain];

新しいLLVMコンパイラを使用してコンパイルする場合は、@autoreleasepool代わりに新しい機能を使用してください。

于 2012-04-11T11:42:06.737 に答える
6

メインルーチンは自動解放プールを作成しません。

使用しているバージョンとコンパイラに応じて、これらの方法のいずれかを使用してください。

新規またはARCの場合:

int main(int argc, char *argv[])
{
    @autoreleasepool {

    // your code

    }
}

また

int main(int argc, char *argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

     // your code

    [pool drain];
}

コードには、次のような他の多くの問題があります。

NSLog (@"v1 and v2 values %i, %i ", v1, v2);

これは

NSLog (@"v1 and v2 values %@, %@ ", v1, v2);

%@はオブジェクトを印刷するために使用され、%iは整数を印刷するために使用されます。

この線:

NSLog (@" KVC Retrieveal  %i ", [t valueForKey:@"x"]);

valueForKeyはオブジェクト(この場合は)を返すため、興味深いNSNumberので、正しいステートメントは次のとおりです。

NSLog (@" KVC Retrieveal  %@ ", [t valueForKey:@"x"]);

これらの修正を加えてプログラムを実行すると、次のようになります。

Retrieving Values 100, 200 
KVC Retrieveal  100 
于 2012-04-11T11:40:37.937 に答える
1

main関数には自動解放プールが必要です。

int main(int argc, char *argv[])
{
    @autoreleasepool {

        // you code

        return ...;
    }
}

編集:
質問の2番目の部分について。valueForKeyを返しid、にキャストしますint

NSLog (@" KVC Retrieveal  %i ", [[t valueForKey:@"x"] intValue]);
于 2012-04-11T11:42:16.420 に答える
0
int main ( int argc, char **argv)

{
 NSAutoreleasePool *myPool = [NSAutoreleasePool new];
  Test *t = [[Test alloc] init];
  /* Synthesized Set Method */
  [t setX:100];
  [t setY:200];
 /* Synthesized Get Method */
  NSLog (@"Retrieving Values %i, %i ",[t x], [t y]);

 /* another Way to retrieve the throuhg KVC Model */
 NSLog (@" KVC Retrieveal  %i ", [t valueForKey:@"x"]);

 [pool drain];
}

それはうまくいくかもしれません

于 2012-04-11T11:46:25.017 に答える