iOS学習ノート(2)-Objective-Cベース


本文の略書の住所:http://www.jianshu.com/p/fbe4ab2edad2
前の記事はiOSが開発した画面と解像度に関する内容をまとめました.iOSの主な開発言語であるobjective-cをまとめました.
1最初のプロジェクトを作成
Xcodeを開いて、File->New->Projectはプロジェクトを作成します.ここで私達はObjective-C言語を勉強しています.だからOS Xを選択して、このセクションの中のAppplicationを作成して、Command Line Toolプロジェクトを作成して、プロジェクト名、組織名などを入力して、作成が完了したら、プロジェクトの中からmain.mファイルが生成されたことが分かります.内容は以下の通りです.Xcodeの上の運転ボタンを直接クリックすると、コンソールからHello, World!が出力されます.
//
// main.m
// My First Project
//
// Created by ssj on 16/1/20.
// Copyright © 2016  ease. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}
2コード構造
main.mの上にある、//の先頭の動作注釈は、C言語と同じである.コード行のNSLogはObjcでよく使用されるデバッグ出力であり、コンソールでログを出力するために使用される.
NSLog(@"Hello, World!");
コメントコードの下にはimport文が続きます.
#import <Foundation/Foundation.h>
Xcodeでは、すべてのコードを一つのファイルに書く必要はなく、import文で導入できます.アプリをコンパイルすると、Xcodeは対応ファイルのコンパイルを見つけます.アップル社はいくつかのOSの特性をfram ewark(フレームワーク)にパッケージ化しました.例えば、上のFoundationフレームは、アプリの基礎的な運行環境を提供しています.
次はメイン関数で、c言語の基本と同じで、次のコードが多くなりました.autoreleasepoolといいます.アプリを開発する時、ボタンでもテキストでもメモリを消費します.Cのように手動でリリースすると、メモリが漏れやすくなります.autrelease poolは自動的にメモリを管理するために使われています.もちろんXcodeはAutomatic Reference Counting(ARC)を提供してメモリの管理を助けています.autreleasepoolとARCの後には専門的に文章でその基本原理をまとめます.
@autoreleasepool {
3言語の基礎
3.1基本変数タイプ
基本変数タイプはint、float、char、BOOL(YESまたはNO)があり、C言語とほぼ一致します.下記の例を通して、基本的な使い方を見てもいいです.コードは参考資料1から来ます.
#import <Foundation/Foundation.h>

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

    @autoreleasepool {
        int answer = 0;
        int guess = 0;
        int turn = 0;
        answer = arc4random() % 100 + 1;
        while (guess != answer) {
            turn++;
            NSLog(@"Guess #%i: Enter a number between 1 and 100", turn);
            scanf("%i", &guess);
            if (guess > answer) {
                NSLog(@"Lower!");
            }
            else if (guess < answer) {
                NSLog(@"Higher!");
            }
            else {
                NSLog(@"Correct! The answer was %i", answer);
            }
        }
        NSLog(@"It took you %i tries", turn);
    }
    return 0;
}
3.2類と対象
Objective-Cは対象に向けた言語で、以前は対象に向けてプログラミングしたことがあるなら、クラスは青写真で、対象は一例です.基本タイプintは単一の値だけを記憶し、オブジェクトは複数の属性または値を記憶することができる.例えばButtonオブジェクトはサイズ、色、ラベルなどがあります.また、オブジェクトは、例えばImageオブジェクトが自分のサイズを変更したり、自分の絵をスクリーンに描いたりする動作も実行されます.
NSString
たとえば下のコードの中に
NSString *name = @"Mike";
nameについて説明すると、nameはNSStringタイプのオブジェクトであり、nameはポインタであるため、より正確にはNSStringオブジェクトを指すポインタであるということが分かります.上に静止した内容を格納する以外に、次のように文字列を作成することもできます.
int x = 10;
NSString *myString = [NSString stringWithFormat:@"The variable x stores the number %i", x];
NSLog(@"%@", myString);
Objective-Cでは、メッセージを送ることによって、あるオブジェクトにいくつかの操作を実行させることができます.例えば上のstring WithFormatは一つのmessageで、対象に向かう中で、私達もよくstring WithFormatを一つの方法と呼びます.:の後に続くのが方法パラメータです.ここのパラメータは2つあります.一つは前の文字列で、一つはxです.注意してください.プリント文字列は%@を使います.元の文字列があって、なぜNSStringを使うのかという質問があるかもしれませんが、その理由は簡単です.NSStringも格納されているCの文字列です.ただし、lengthなどの方法が付いています.C StringからNSStringに変換するのも便利です.以下の方法で実現できます.
NSString *inputString = [NSString stringWithCString:cstring encoding:1];
クラスとオブジェクト
古いバージョンのobjective-cでは、一般的に次のようなクラスを作成します.インスタンス変数を宣言する必要があります.propertyキーワードを使用していません.次のコードのようにPersonクラスを作成し、2つのインスタンス変数nameとageがあります.
//Person.h
#import <Foundation/Foundation.h>

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

- (void)printInfo;
- (void)setInfo:(NSString *)name age:(int)age;

@end


//Person.m

#import "Person.h"

@implementation Person

- (void)printInfo {
    NSLog(@"name=%@, age=%d", name, age);
}

- (void)setInfo: (NSString *)pname age:(int)page {
    name = pname;
    age = page;
}

@end


//main.m
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [[Person alloc] init];
        [p setInfo:@"  " age:29];
        [p printInfo];
    }
    return 0;
}
アップル社がその後、コンパイラをGCCからLLVMに変更し、propertyのキーワードを追加すると、もはやステートメントインスタンス変数が必要なくなります.ステートメント属性だけが必要です.コンパイラは自動的にアンダースコアのインスタンス変数とgetter/setter方法を生成します.実例変数を参照することは、下線_nameによってもよく、self.nameによってもよく、self.nameは、実際には属性を呼び出すgetter/setter方法であることに留意されたい.
//Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject;

@property (nonatomic, strong) NSString *name;
@property int age;

- (void)printInfo;
- (void)setInfo:(NSString *)name age:(int)age;

@end


//Person.m
#import "Person.h"

@implementation Person

- (void)printInfo {
    NSLog(@"name=%@, age=%d", _name, _age);
}

- (void)setInfo: (NSString *)name age:(int)age {
   self.name = name; //    [self setName:name];
   _age = age; 
}

@end
また、@synthesizeキーワードがあり、属性に対応するインスタンス変数を指定します.たとえばPerson.mでインスタンス変数nameをmynameと名前を変更すると、アクセスインスタンス変数が使用できなくなります.name、mynameに変えなければなりません.
#import "Person.h"

@implementation Person

@synthesize name = myname;

- (void)printInfo {
    NSLog(@"name=%@, age=%d", myname, _age);
}

- (void)setInfo: (NSString *)name age:(int)age {
    [self setName:name];
    self.age = age;
}

@end
NSAray&NSDictionaryとその可変タイプ
最後にNSArayとNSDictionaryを見ます.NSArayは配列であり、配列要素は任意のNSObjectタイプであってもよい.以下のようにNSArayに複数のPersonオブジェクトを追加すると、NSArryは可変タイプではないので、作成後に動的に要素を追加することはできません.動的に参加するには、NSMutable Arayを使用すればいいです.NSDictionaryは辞書タイプであり、NSMutble Dicturryは可変辞書タイプであり、なお、辞書のkeyはNSObjectタイプまたはサブタイプでなければならず、intまたはNSIntegerタイプの値ではない.使用方法はコードを参照してください.
   Person *p = [[Person alloc] init];
   [p setInfo:@"  " age:29];

   Person *p2 = [[Person alloc] init];
   [p2 setInfo:@"    " age:21];

   NSArray *array = [[NSArray alloc] initWithObjects:p, p2, nil];
   for (Person *p in array) {
      [p printInfo];
   }

   Person *p3 = [[Person alloc] init];
   [p3 setInfo:@"   " age:23];

   NSMutableArray *marray = [[NSMutableArray alloc] initWithObjects:p, p2, nil];
   [marray addObject:p3];
   for (Person *p in marray) {
      [p printInfo];
   }

   NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"  ", @"name", @"29", @"age", nil]; 
   for (NSString *key in dict) {
       NSLog(@"key=%@, val=%@", key, [dict objectForKey:key]);
   }
4参考資料
  • http://www.raywenderlich.com/40293/learn-to-code-ios-apps-2-strings-arrays-objects-and-classes
  • Objective-C属性およびインスタンス変数