• OC语言(六)


    四十六.block类型

    用来封装代码,可以在任何时候执行。
    与函数的区别:可以在运行时动态产生。

    block的标志:^

    有形参、有返回值

        int (^sumblock)(int,int) = ^(int a, int b){

            NSLog(@"a + b = %d",a+b);

            return a+b;

        };

        

        sumblock(1,2);


    注意结尾的分号。很像函数指针。

    函数指针的写法:

    int (*p)(int, int) = sum;


    如果block没有形参,可以省略()。


    用typedef来简化


    简化函数指针int (*p)(int, int)

    typedef int (*SumP)(int, int);


    简化block

    typedef int (^MyBlock)(int, int);

    #import <Foundation/Foundation.h>


    typedef int (^MyBlock)(intint);


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

        

        MyBlock sumBlock = ^(int a, int b){

            NSLog(@"a + b = %d",a+b);

            return a+b;

        };

        

        sumBlock(1,2);

        

        return 0;

    }


    block总结:

    block可以直接访问外部变量,默认情况下,block内部不能修改外面的局部变量,给局部变量加上__block关键字就可以修改。


    四十七.protocol协议


    注意拼写

    两种设计模式:代理模式和观察者模式。

    主要用于代理模式。

    类似Java中的接口。

    在Objectvie-C File中选择创建。
    只要类遵守协议,就能使用协议的所有方法。

    < >表示遵守协议

    protocol的参数:

    1.必须实现:@required(默认),不一定必须:@optionnal。
    这两个关键字主要用于程序员交流。
    不实现不报错,只是警告。

    @protocol MyProtocol <NSObject>


    @required

    - (void)test;


    @optional

    - (void)test2;


    @end


    #import "MyProtocol.h"


    @interface Person : NSObject <MyProtocol>



    @end


    2.只要某个类遵守,就相当于子类也遵守了。


    3.遵守多个协议(Java中也可以继承多个接口)

    #import "MyProtocol.h"

    #import "MyProtocol2.h"


    @interface Person : NSObject <MyProtocolMyProtocol2>



    @end


    4.基协议(类似基类,一个协议可以遵守其他协议)

    #import "MyProtocol.h"

    @protocol MyProtocol2 <MyProtocol>

    默认的基协议是NSObject,是默认遵守的。

    由于基类遵守基协议,因此所有OC对象都遵守基协议,才有retain、release等内容。


    写协议一定要最终遵守NSObject。


    5.要求某个类必须遵守某个协议

    类名<协议> *obj = ……

    Person<MyProtocal2> *p = [[Person allocinit];


    类似于@class,可以用@protocol来告诉编译器这是一个协议,但是真正用到协议,还是得在相应的位置加上protocol的.h文件。

    用@protocol可以提高性能。


    如果一个协议只用到某个类中,可以把协议定义在这个类中。

    如果多个类用到,应该是单独的文件。


    分类也有写在某个类中的,只要求能看懂语法(系统自带)。


    四十八.代理设计模式


    注意降低耦合性(删掉代理原来的类不能受影响)

    需求:Person对象委托Other对象给他买电影票。

    一个类的某些工作依靠其他类来工作,但并不需要知道内部原理。

    注意使用id来降低耦合性,在id后加上具体协议<>来保证可以调用相应的方法。

    所有方法都使用protocol来声明,命名为XxxDelegate。

    //

    //  TicketDelegate.h

    //  代理模式

    //

    //  Created by 11 on 2/1/15.

    //  Copyright (c) 2015 11. All rights reserved.

    //


    #import <Foundation/Foundation.h>


    @protocol TicketDelegate <NSObject>


    - (double) ticketPrice;


    - (int) leftTicketsNum;


    @end


    //

    //  Agent.h

    //  代理模式

    //

    //  Created by 11 on 2/1/15.

    //  Copyright (c) 2015 11. All rights reserved.

    //


    #import <Foundation/Foundation.h>

    #import "TicketDelegate.h"


    @interface Agent : NSObject <TicketDelegate>


    @end


    //

    //  Agent.m

    //  代理模式

    //

    //  Created by 11 on 2/1/15.

    //  Copyright (c) 2015 11. All rights reserved.

    //


    #import "Agent.h"


    @implementation Agent


    - (double) ticketPrice{

        return 35;

    }


    - (int) leftTicketsNum{

        return 1;

    }


    @end


    Person *p = [[Person allocinit];

    Agent *a = [[Agent allocinit];

    p.delegate = a;

    [p buyTicket];


    代理的实例:

    UITableView,通过代理设置要显示的表格数量和内容。

    还有个数据源UITableViewDataSource,它是一个协议。


    四十九.Foundation框架

    Foundation是基础的意思,这是一个基础框架。
    包括了结构体、枚举、类。

    想用框架的所有部分,只需要包含其主头文件。

    注意结构体内部的点语法是直接访问结构体成员,不是get和set,get和set是对象特有的。

    **NS与CG区别,NSMakeXxx,CGXxxMake。

    1.NSRange 表示范围

    typedef struct _NSRange {

        NSUInteger location;

        NSUInteger length;

    } NSRange;


    例如表示@“I love OC”中的”love",则location = 2,length = 4


    结构体的赋值:直接用XXMake函数。


    从字符串中取出子串的range:

    NSString *str = @"I love OC";     

    NSRange r2 = [str rangeOfString:@"love];

    找不到返回location=-1。(NSNotFound = -1)


    加入CoreGraphics框架后再使用!


    2.CGPoint

    struct CGPoint {

      CGFloat x;

      CGFloat y;

    };

    typedef CGPoint NSPoint;


    CGPoint和NSPoint是等价的。应该用CGPoint。


    用CGPointMake函数产生。


    3.CGSize

    struct CGSize {

      CGFloat width;

      CGFloat height;

    };

    typedef struct CGSize CGSize;


    4.CGRect

    包含了点跟尺寸。

    struct CGRect {

      CGPoint origin;

      CGSize size;

    };

    typedef struct CGRect CGRect;


    打印结构体的方法:NSStringFromXxx

    例如:

    NSStringFromPoint(p1);


    结构体赋值的其他方法:

    1.{x,x, …},对于结构体内有结构体 { {x,x,…},{x,x,…},…}

    2.已有的常量,如(0,0)点,可以用CGPointZero。几乎每个都有自己的Zero常量。

    3.判断全等:XxxEqualToXxx(Xxx1,Xxx2)。

    4.判断是否包含:CGRectContainsPoint(CGRectMake(00100100), CGPointMake(1515));


    遇到莫名其妙的问题可以clean工程。


    要加入框架才能使用高级函数(Xcode6以后似乎不需要主动加入框架):



    要有这个框架,才能使用CG系列的高级函数(高版本的Xcode似乎可以不引入- -)。


    //NS的来历:NextStep公司设计出的Foundation框架


    五十.NSString深入

    NSMutableString是可变字符串,它是NSString的子类。

    字符串的创建:

    NSString *s1 = @"12345";

    //NSString *s2 = [[NSString alloc] initWithString:@"12345"];

    s1 = [[NSString allocinitWithFormat:@"12345"];

    s1 = [[NSString allocinitWithUTF8String:"12345];



    C语言字符串转OC字符串:

    s1 = [[NSString allocinitWithUTF8String:"12345];

    OC转C:

    const char* c1 = [s1 UTF8String];


    从文件中读取:

    s1 = [[NSString allocinitWithContentsOfFile:@“url" encoding:NSUTF8StringEncoding error:nil];


    从URL获取:

    协议头:

    http:// 网络资源

    file:// 本地资源

    ftp://  FTP资源

    具体实现

    注意协议头的//和目录的/都要写

    NSURL *url = [[NSURL allocinitWithString:@"file:///Users/soulghost/Documents/1.txt"];

    s1 = [[NSString allocinitWithContentsOfURL:url encoding:(NSUTF8StringEncodingerror:nil];


    可以不用alloc,有相应的类方法可以调用。


    注意一个细节,id返回值的类方法已经被抛弃,以instancetype作为返回值可以在一些违法类型类方法的时候发出警告(例如模型对象转化为NSString调用字符串的对象方法)。

    但是instancetype只能用在返回值,任意类型还是要用id。

    规律:类名开头。


    URL免去协议头:fileURLWithPath为file://开头。


    将字符串写入文件:

    atomically为原子性操作,中途失败不创建。

    NSURL *url1 = [[NSURL allocinitWithString:@"file:///Users/soulghost/Documents/my.txt"];

    [s1 writeToFile:url1 atomically:YES encoding:NSUTF8StringEncoding error:nil];

    还有writeToURL方法可以写入URL中。

    文件里的每一个换行都是一个’ ’


    NSMutableString可变字符串

    拼接的类方法:

    NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 10"];

    [s1 appendFormat:@" wahaha];

    删除其中的is:

    [s1 deleteCharactersInRange:[s1 rangeOfString:@"is"]];


    注意NSString有stringByAppendingString对象方法返回一个新的字符串,与上面改变自身不同。


    五十一.集合类

    三个集合类
    1.NSArray(不可变数组,改变后只能是生成新数组)
    NSArray以面向对象的方式操纵数组。
    缺点是只能存放OC对象(struct不是OC对象)。

    创建空数组

    NSArray *array = [NSArray array];

    创建多元素数组:注意nil是结束标志,OC数组不能存放空值。

    array = [NSArray arrayWithObjects:@"jack"@"rose"nil];


    count对象方法可以得到对象个数。也可以用点语法。

    注意count返回的是unsigned long。


    获取对象:objectAtIndex对象方法。也可以写索引方式array[x](编译器特性)。


    数组初始化的编译器特性:

    array = @[@"jack",@"rose”];


    NSArray的遍历:

    OC中的范围for仍然用for,语法为 id xx in xx

    for (id obj in array){

            NSLog(@"%@",obj);

    }

    使用block(在block的提示上回车就可以生成默认代码块)

    [array enumerateObjectsUsingBlock:

         ^(id obj, NSUInteger idx, BOOL *stop) {

             NSLog(@"obj = %@, idx = %ld",obj,idx);

    }];

    在block中停止遍历的方法:

    *stop = YES;


    block遍历的本质也是一个for循环,在for循环中不断的执行block,并且把bool的地址传进去,这样才能改变bool变量。


    2.NSMutableArray

    NSMutableArray *marray = [NSMutableArray array];

    [marray addObject:@"jack"];

    [marray addObject:@"rose];


    初始化不可以使用@初始化。


    删除元素:

    使用removeObject...方法


    3.NSSet

    与数组的区别是无序。

    方法就是把Array替换为Set。

    取出NSSet中元素:anyObject方法随机返回对象。

    NSMutableSet与前面一样,删除对象有removeObject:id与removeAllObject。


    4.NSDictionary类似java中的map

    初始化:

    NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"jack",@"john"] forKeys:@[@"name1",@"name2"]];

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name1",@"john",@"name2"nil];

    注意先value后key。


    快速初始化Dictionary,以@开头。也是编译器特性。

    dict = @{@"name1":@"jack",@"name2":@"john"};


    取出值的编译器特性,dict[@"name1”];


    5.NSMutableDictionary


    创建空的:

     NSMutableDictionary *mdict = [NSMutableDictionary dictionary];

    添加元素:



    重复的key会将value更新。

    删除元素:

    -removeObjectForKey


    字典的遍历:

    取出key的方法:

    NSArray *keys = [dict allKeys];

    或者:

    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

            NSLog(@"%@:%@",key,obj);

    }];


    6.将基本类型装入集合


    先将基本数据类型进行包装。


    NSNumber对象,+numberwithXxx方法


    NSNumber转回基本数据类型,-intValue -xxxValue(其他类型也可以这么解析,例如NSString转数字)


    编译器特性,@+基本数据类型=NSNumber对象,如@20,@YES自动生成NSNumber对象。

    对于变量 @(<变量名>)


    NSNumber只能包装数字。


    要包装结构体,用NSValue。它可以包装任何东西。



    7.NSDate

    NSDate *date = [NSDate date];

    NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];

    NSTimeInterval secs = [date timeIntervalSince1970];


    日期格式化:H为24小时制,h为12小时制。y M d H/h m s。

    NSDateFormatter *formatter = [[NSDateFormatter allocinit];

    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    NSString *str = [formatter stringFromDate:date];























  • 相关阅读:
    线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
    C#打印图片
    javascript 地址栏写法
    SQLServer获取Excel中所有Sheet
    C#多页打印实现
    clear在CSS中的妙用
    mitmproxy使用总结
    本地回路抓包问题
    博客园界面优化
    CentOS基于MySQL提供的Yum repository安装MySQL5.6
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154253.html
Copyright © 2020-2023  润新知