IOS_OC_基礎文法

4770 ワード

1.YESとNO
Object-cはBOOLタイプを提供していますが、このBOOLタイプはC++とは違います.C++では0値以外のものはすべてtrueで、0値のものはfalseです.ただし、Object-cでは1がtrueでマクロ定義がYES=1、0がfalse、マクロ定義がNO=0である.
+ (BOOL)isEquals:(int)x with:(int)y
{
    return x - y;
}
if ([Provider isEquals:10 with:1021]) {// == YES //error
        NSLog(@" !!!!!!");
 } else {
        NSLog(@" ===== ");
 }

2.クラスCLass
selfは、現在のクラスまたはオブジェクトを指すことができます.
+クラス関数で指定クラスメソッドを呼び出すと、-で指定メンバーメソッドを呼び出す
メンバー変数の繰り返し定義は許可されませんが、メソッドは書き換えられ、サブクラスメソッドが優先的に呼び出されます.
nimal *a = [Dog new];
//[a run]; a          Dog     ,       isa     ,        Dog   run  
Class c = [Animal class];
Animal *a = [Animal new];

NSLog(@"%p", c);
NSLog(@"%p", [a class]);

[c show];// + show
[a show];// - show

関数とメソッドの違い:関数はファイルに属します
@implementation Person
void s()
{
    //NSLog(@"s() invoke %d", _age);          
    NSLog(@"s() invoke");
}
@end

int main(int argc, const char * argv[])
{
    s();
    return 0;
}
@interface Person : NSObject
{
    int _age;
}
- (void)setAge:(int)age;
- (void)show;
+ (void)log;
@end

@implementation Person

- (void)setAge:(int)age
{
    _age = age;
}

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

+ (void)log
{
    NSLog(@"log information");
}

@end

int main(int argc, const char * argv[])
{
    Person *p = [Person new];
    [p setAge:100];
    [p show];
    //[Person show]; // error   Person      +show  
    [Person log];
    //[p log];       //error   Person      -log  
    
    return 0;
}

OCのクラスでは、受信パラメータに関係なく、メソッド名に基づいて関数が繰り返されるかどうかを区別する関数の繰り返し定義は許可されません.Javaとは違う
public void getInfo(Animal a);
public void getInfo(Person p);
//     getInfo:
- (void)getInfo:(Animal)a;
- (void)getInfo:(Person)p;

3.一般的な集合
void arrayTest()
{
    NSArray *array = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
    NSLog(@"len = %lu", [array count]);
    for (NSObject *obj in array) {
        NSLog(@"== %@", obj);
    }
    for (int i=0; i<[array count]; i++) {
        NSLog(@"%@", [array objectAtIndex:i]);
    }
    //    ,atomically              ,       ,        ,       。
    [array writeToFile:@"/Users/zf/Desktop/1.txt" atomically:YES];
    //    
    NSArray *arr = [NSArray arrayWithContentsOfFile:@"/Users/zf/Desktop/1.txt"];
    NSLog(@"len3 = %lu", [arr count]);
    
}
void mutableArrayTest()
{
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:3];
    [array addObject:@"one"];
    [array addObject:@"two"];
    [array addObject:@"three"];
    [array addObject:@"two1"];
    
    NSLog(@"len = %lu", [array count]);
    [array removeObjectAtIndex:3];
    NSLog(@"len = %lu", [array count]);
    
    NSEnumerator *e = [array objectEnumerator];
    NSString *x;
    while (x = [e nextObject]) {
        NSLog(@"x == %@", x);
    }
    NSEnumerator *e1 = [array reverseObjectEnumerator];
}
void dictTest()
{
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
    NSLog(@"%@", [dict objectForKey:@"key2"]);
    
    NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:3];
    
    [d setObject:@"wwwwww" forKey:@"key1"];
    [d removeObjectForKey:@"key1"];
    NSLog(@"%lu, key1=%@", [d count], [d objectForKey:@"key1"]);
}

NSArray:秩序化された集合で、要素はブロック全体のメモリに配列され、順序付けされています.
NSSet:無秩序集合、ハッシュストレージ.開発者を読むApple NSSetについての説明:You can use sets as an alternative to arrays when the order of elements isn’t important and performance in testing wheter an object is contained in the set is a consideration-while arrays are ordered,testing for membership is slower than with sets.要素を検索すると、NSSetの効率はNSArrayよりも高くなります.どうしてですか.原理は比較的に簡単です:NSSetの中の要素の記憶とアクセスはすべて1つのhashの過程です.例えば、要素Aを格納すると、hashアルゴリズムは直接Aが格納すべき位置を見つけることができます.同様に、Aにアクセスすると、hashプロシージャがAストレージの場所を見つけることができます.NSArrayでは,Aが配列中にないことを知るには,1つの要素の比較が必要であり,明らかに効率が悪い.
4.NSString
void stringTest()
{
    NSString *str = [NSString stringWithFormat:@"aa,bb,cc,"];
    NSArray *array = [str componentsSeparatedByString:@","];
    NSLog(@"len = %lu", [array count]);
    
    NSLog(@"%@", [array componentsJoinedByString:@"-"]);
}