0

初投稿。Objective C を学習しようとしています。OOP に関する十分な知識があります。私は C、C++、および Java のバックグラウンドを少し持っていますが、さびています。残念ながら、いくつかの Objective C の概念と構文について理解するのに苦労しています。

compileonline でいくつかのコードを試しています。いくつかのコメントアウトの後、コードが機能するようになりましたが、メソッド宣言がまだコメントアウトされていることに気付きました。initWithNameを参照

#import <Foundation/Foundation.h>

@interface cl_person: NSObject
{
    NSString* name;
    int age;
}

//-(id)init;
//-(id)initWithName: (NSString*)p_name withAge: (int)p_age;
-(void)display;

@end

@implementation cl_person
/*
-(id)init{

  return self;
}*/

-(id)initWithName: (NSString*)p_name{

  //self = [self init];
  name = p_name;
  return self;
}


-(id)initWithName: (NSString*)p_name withAge: (int)p_age{

  self = [self initWithName: p_name];
  age = p_age;
  return self;  
}

-(void)display{

  printf("My name is %s and I am %d years old.", [name UTF8String], age);
}

@end

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

  cl_person *o_person = [[cl_person alloc] initWithName: @"Dick" withAge: 25];   
  [o_person display];
  [o_person release];

  //NSLog (@"hello world");
  [pool drain];
  return 0;
}
  1. (id)initWithName は NSObject のメソッドだと思いますので、直接実装することはスーパークラスのメソッドをオーバーライドすることを意味します。私は正しいですか?
  2. Apple dev docs によると、セレクターは Method signature の一部です。入力タイプとその順序は言うまでもありませんが、この例のいくつかの点で混乱します。宣言されていないのに、selector withAge を使用してメソッドを実装できるのはなぜですか?

これがすでに他の場所でカバーされている場合はお詫び申し上げます。私は簡単な検索を行い、関連する可能性のあるいくつかのヒットを閲覧しましたが、何も役に立ちませんでした. ありがとう!

[NSTotalNoob リリース];

4

1 に答える 1

0
  1. いいえ、そのメソッドはこのクラスに固有です。

  2. 「セレクターwithAgeでメソッドを実装する」というのが何を意味するのかわかりません。そのメソッドの名前は initWithName:withAge: です。そのすべてが 1 つの名前の一部です。Objective-C では、メソッドを宣言する必要はありません。それらをクラスの外から見たい場合は、.h ファイルで宣言する必要があります。クラスの外から呼び出すことはできるが、コンパイラの警告が表示されるという人もいますが、Xcode で取得したデフォルト設定の ARC では、これを行うことはできません。エラーであり、コンパイラからの警告だけではありません。

あなたはまったくの素人なので、他にもいくつか言及しておく必要があります。通常、OS X と iOS では、テンプレートが提供するもの以外のコードを main.m ファイルに入れません。クラス名は大文字で始め、メソッド、ivar、およびプロパティは小文字で始める必要があります。また、名前付けにはアンダースコアではなくキャメル ケースを使用するため、クラスは ClPerson として記述し、インスタンスは oPerson として記述したほうがよいでしょう。

于 2013-05-08T06:02:55.643 に答える