3

私は古い手続き型言語プログラマーで、Obj C を学ぼうとしています。そして、髪の毛をすべて引き抜いた後、根本的な理解が欠けていることに気付きました。

オブジェクトのインスタンス ( myObj ) を割り当て、メソッドを介してデータを与え、メソッドを呼び出してそのインスタンスにメッセージを送信する場合、実装ルーチンはそのインスタンスのすべてのデータが利用可能であると想定できますか?

つまり、[myObj doSomeStuff] doSomeStuff の実装は、myObj のすべてのインスタンス データが利用可能であると想定できますか、それとも必要な myObj のすべての部分と部分の引数として送信する必要がありますか?

4

2 に答える 2

3

ルイスとマディが言ったことに同上。これのいくつかは、例で最もよく説明されています。Circle クラス オブジェクトを考えてみましょう。

.h ファイルは次のとおりです。

//  Circle.h

#import <Foundation/Foundation.h>

@interface Circle : NSObject
{
    double radius;
    double pi;
}

@property double radius, pi;

-(double) area;
-(double) diameter;
-(double) circumference;

@end

そして、実装ファイル (Luis が指摘するように、インスタンス メソッドを定義したことに注意してください):

//  Circle.m

#import "Circle.h"

@implementation Circle

@synthesize radius, pi;

// Initialize with default radius:
- (instancetype)init {
    self = [super init];
    if (self) {
        pi = 3.14159;
        NSLog(@"Circle created.");
    }
    return self;
}

-(double) area {
    return pi*radius*radius;
}

-(double) diameter {
    return 2*radius;
}

-(double) circumference {
    return 2*pi*radius;
}

@end

main で circle オブジェクトを作成し、メッセージを送信して、関連するいくつかの数量を返します。

//  main.m

#import <Foundation/Foundation.h>
#import "Circle.h"

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

        Circle *aCircle = [[Circle alloc] init];

        [aCircle setRadius:2];

        NSLog(@"Area = %f",[aCircle area]);
        NSLog(@"Circumference = %f",[aCircle circumference]);
        NSLog(@"Diameter = %f",[aCircle diameter]);
        NSLog(@"Check pi = %f",[aCircle pi]);

    }
    return 0;
}

この例から、オブジェクトの作成時にpiの値が設定され、オブジェクトの一部として保存され、他の計算に使用できることがわかります。

注: 実際にはこの方法でpiを定義したくないでしょう。これは要点を説明するための単純な例です。

また、オブジェクトの作成後にオブジェクトの他の内部値を設定できたことにも注意してください。このデータは、投稿で指摘されている条件に従って、その時点から利用可能になります。

これはより理にかなっていますか?このコードを実行して、慣れるまでアイデアを試してみてください。

EDIT : Andrew Madsen の提案で、面積、直径、円周のアクセサ メソッドを更新しました。これらに「get」を前に付けないでください

于 2013-11-12T19:23:58.840 に答える