zoukankan      html  css  js  c++  java
  • OC入门笔记

    1OC概述
    OC主要负责UI界面;C语言和C++可以用于图形处理。OC是一门面向对象的语言。C语言是面向过程的。比C++简单很多
    以C语言为基础,完全兼容C语言。OC语言中的所有事物都是对象,都有isa指针。
    作用:使用OC开发MacOSX平台(开发电脑桌面的一些软件)和IOS平台的应用程序。
    数据类型:char、int、float、double、BOOL(yes o)注意:比C语言加多了最后一位。
    nil相当于Java中的null,空值的意思
    self相当于Java中的this,指向当前对象的意思
    基本语句:循环语句(do while、while、for)、条件语句(if、if-else、switch)、goto语句
    for循环快速遍历:for(xx in xx)
    基类:NSObject
    继承:单继承,用super关键字引用父类对象
    异常处理:@cry @catch @finally
    注释://和/*....*/
    日志输出:NSLog(@"Hello");NSLog 会自动换行,比printf好
    3第一个OC的类
    类:OC中类分为2个文件
    .h,类的声明文件,用于声明变量、函数(方法)
    .m,类的实现文件,用于实现.h的函数(方法)
    类的声明使用关键字@interface、@end
    类的实现使用关键字@implementation、@end

    例子:
    #import <Foundation.h>
    //@interface代表声明一个类
    //:代表继承,{}表示定义成员变量
    @interface Student :NSObject{
    int _age;//方法名是age
    }
    //get方法:
    //-代表动态方法(对象方法)   +代表静态方法(类方法)
    //这里声明的所有方法都是公共的
    -(int)Age;
    //set方法:
    -(void)setAge:(int)newAge;//一个冒号代表一个参数方法名是setAge:
    @end
    实现.m:
    #import "Student.h"
    @implementation Student
    -(int)Age{
     NSLog(@"调用了getAge方法");
     return _age;
    }
    -(void)setAge:(int)newAge{
     _age=newAge;
    NSLog(@"调用了SetAge方法");
     }
    @end
    main.m这个文件
    #import <Foundation.h>
    #import "Student.h"
    int main(int argc,const char *argv[])
    {
     @autoreleasepool{
     //创建一个student对象:
     //1调用一个静态方法alloc来分配内存调用类这个方法
     //暂时把id当做是任何对象
    Student *stu=[[Student alloc] init];
     [stu setAge:100];
     int age=[stu Age];
     NSLog(@"age is %i",age);
     //释放对象
     [Stu release];
     }
     return 0;
    }

    4点语法
    [Stu setAge:100];相当于
    stu.age=100;//set方法赋值
    int age=[stu Age]也等效于int age=stu.Age //get方法取值
    .一个点代表get方法和set方法。

    5构造方法和description方法
    自己写一个构造方法:在.h文件中,要求成员变量传给我
    -(id)initwithAge:(int)age andNo:(int)no;
    实现构造方法:
    -(id)initwithAge:(int)age andNo:(int)no{//首先要 调用父类super的构造方法
    self=[super init];//如果self不为kong
    if (self !=nil){
    _age=age;
    _no=no;
    }
    return self;
    }
    @end
    注意:%@代表打印一个OC对象
    //在.m中:
    重写父类的description方法:当使用%@打印一个对象时候会调用这个方法
    -(NSString *)description{
    NSString *str=[NSString StringwithFormat:@"age is %i and no is %i",_age,_no];
    return str;//stringwithformat方法代表调用一个类的静态方法,不需要释放,静态方法创建的对象都是自动释放的。

    }@end
    (NSString *)str=@"itcast"//代表OC中的字符串
    重点:如果使用系统自带的静态方法创建对象的都是自动释放的。

    6********类方法+和实例(对象)方法的区别:
    @1实例方法是-,类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类。
    在实例方法里,根据继承原理发送消息给self和super其实都是发送给self
    在类方法里面self是其他的类的类方法,在类方法中给self发送消息只能发类方法self是类super也是
    什么时候用类方法,要创建一个实例时候获取一个共享实例,或者获取关于类的一些共有信息
    @2类方法(class method)和实例方法(instance method)。类方法被限定在类范围内,不能被类的实例调用(即脱离实例运行)。alloc就是一种类方法。实例方法限定在对象实例的范围内(即实例化之前不能运行)。init就是一种实例方法,被alloc方法返回的对象实例调用。
    NSObject *object1=[NSObject alloc]init];
    @3OC对类的定义和实现以及初始化:
    //声明类接口,继承NSObject对象(该对象是OC中所有类的顶级父类,所有类都继承于它)
    @interface ClassName :NSObject
    +(void)function;//类方法,不需要实例化对象就可以调用的方法
    - (void)function2 :(NSString *)arg;//成员方法,必须通过实例化的对象调用
    @end

    //实现类
    @imlementation ClassName
    //成员属性初始化和方法的定义
    @end

    对象的初始化:ClassName *obj = [[ClassName alloc] init]
    OC中以消息机制传递信息,发送alloc消息给类分配内存空间,发送init消息生成对象,指针指向对象本身。

    类方法的调用:
    [obj function];第一种
    NSString *str = [NSString stringWithString:@"hello”];第二种
    [obj function2 : str];

    OC7-self、自动释放、变量作用域
    类:方法的声明和实现,都必须以+或者-开头:+表示类方法(静态方法)调用类名使用;-表示对象(实例)方法(动态方法)
    在.h声明的所有方法都是public类型(通过Category可以实现private)
    变量的作用域:
    @public全局都可以访问
    @protected只能在类内部和子类中访问
    @private只能在类内部访问
    变量必须定义在类的{}中
    成员变量默认情况下是@protected,子类可以访问父类的成员变量。
    补充:
    -(void)test{
     int age=self.age;
    }
    self在动态方法中是指调用这个方法的当前对象
    +(void)test2{
     [student alloc];等效于[self alloc]
    }
    @end
    self在静态代表类名,静态方法通过类名来调用。谁调用方法,self就指向谁。
    如果直接把方法写在.m文件中,没有在.h文件中进行声明,那么就是私有方法

    OC8-@property和@synthesize
    @property让编译器自动生成getter和setter的声明(编译器的特性)
    用@property int age;就可以代替下面两行:
    -(int)age;//getter
    -(void)setAge:(int)newAge;//setter当编译器遇到@property时会自动展开成getter和setter的声明。。。
    用@synthesize age=_age;就可以代替下面6行:
    -(void)setAge:(int)newAge{
     age=newAge;
    }
    -(int)age{
     return age;
    }
    @synthesize让编译器自动生成getter和setter的实现。
    注意:@synthesize默认会去访问跟age同名的变量,如果找不到同名的变量会自动生成一个私有的同名变量age
    Xcode4.5的环境下,可以省略@synthesize,并且默认会去访问_age这个成员变量,如果找不到_age这个成员变量,会自动生成一个叫做_age私有成员变量。
    如果我们在.m文件里面手动实现了setter和getter方法,那么@synthesize就不会生成setter和getter方法,相当于作废;如果我们只是纯粹手动实现了getter方法,那么@synthesize会帮我们生成setter方法的实现,并不会生成getter方法的实现;如果我们只是实现了setter方法,没有实现getter方法,那么@synthesize就不会帮我们实现setter方法,而会帮我们生成标准的getter方法实现;果我们两个都没有实现,那么@synthesize就会帮我们生成标准的setter方法和getter方法。

    OC9-内存管理1-retain和release
    内存管理范围:任何继承了NSObject的对象都要释放,对基本数据类型无效;
    原理:每个对象内部都保存了一个与之相关联的整数,称为引用计数器;
    当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
    给对象发送一条retain消息,可以使用计数器+1;
    给对象发送一条release消息,可以使用计数器-1;
    当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法;
    可以给对象发送retainCount消息获得当前的引用计数器值。
    注意:其实发送消息就是调用方法的意思。
    _(void)dealloc {
     NSLog(@"%@被销毁了",self);
    }
    [super dealloc];
    //一定要调用super的dealloc方法,而且最好放在最后面调用
    注意点:不要重复释放,会发送野指针错误,也就是说访问了不属于你的内存。
    NSLog(@"count:% zi",[stu retainCount]);//z代表无符号
    内存管理原则:
    1谁创建,谁释放。如果你通过alloc、new或者(mutable)copy来创建一个对象,那么你必须调用release或者autorelease。
    2一般来说,除了alloc、new或者copy之外的方法创建的对象都被声明了autorelease
    3谁retain,谁release。只有你调用了retain,不管这个对象如何生成的,你都要用release

    OC11-@class关键字
    用@class+类名可以代替#import "Student.h"
    作用:只是声明一个类
    注意:如果是继承某个类,就要导入类的头文件;如果只是定义成员变量、属性,用@class
    区别:
    通常引用一个类有2种办法:一种是通过#import方式引入;一种是通过@class引入。#import方式包含被引用类的所有信息,包括被引用类的方法和变量;@class方式只是告诉编译器在A.h文件中B*b只是类的声明,具体这个类里面有什么信息这里不需要知道,等实现文件中真正要用时,才会真正去查看B类中信息。使用@class方式由于只需要知道被引用类的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所有在.m文件中需要使用#import来包含被引用类的头文件。如果有上百个头文件都#import了同一个文件,或者这些文件一次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这种问题了。对于循环依赖关系来说,比如A类引用B类,B类引用A类代码,编译会报错。

    OC12-内存管理@property参数详解
    @property(retain)//get方法不需要管理内存。这里的retain代表:在set方法中,release旧值,retain新值。
    格式:@property(参数1,参数2)类型 名字   参数可有可无,比如:
    @property int age;是基本数据就写这样,如果是对象,就写@peoperty (retain)写retain会帮忙管理内存,不写不会管理。
    @property(notatomic,retain)面试时候会问:1表示不需要枷锁get方法和set方法,不需要考虑线程安全问题,只要提高性能;2表示不需要内存管理。
    参数分为3类:
    读写属性:readwrite/readonly
    setter处理:assign/retain/copy
    原子性:atomic/nonatomic
    readonly代表只生成get方法声明和实现;默认是readwrite,同时生成get和set方法的声明;assign:默认基本类型,setter方法直接赋值,而不进行retain操作;retain代表:setter方法release旧值,retain新值;@property默认为atomic,提供多线程安全,保证线程安全,降低性能;copy:setter方法release旧值,再copy新值
    nonatomic代表方法不许考虑线程安全问题,禁止多线程,变量保护,提高性能(多用nonatomic)

    OC13-内存管理autorelease
    autorelease pool自动释放池统一回收对象当自动释放池销毁,池里面的所有对象会调用一次release方法。
    @autoreleasepool{
    student * stu=[[[student alloc]init]autorelease];//创建一个对象
    }
    重点:一般可以为类添加一个快速创建对象的静态方法
    .h声明:+(id)studentWithAge:(int)age;//快速创建一个对象,意思就是把一个age给我我就快速创建一个student对象
    .m实现:
    +(id)student{
    return [[[student alloc]init]autorelease];
    }
    +(id)studentWithage:(int)age{
     student * stu=[[[student alloc]init]autorelease];
     stu.age=age;
     return  stu;
    }

    OC14-Category
    怎么创建一个分类?
    分类只能扩展方法,不能增加成员变量
    //()代表一个分类,而()中的内容就是分类名称
    注意:类名后面有冒号:代表继承;有括号()代表分类  比如
    @interface student :NSOject
    @interface student (test)
    方便团队合作

    OC15-Protocol
    简单来说就是一系列方法列表,可以声明很多方法,声明方法可以被任何类实现,称为代理模式。
    在iOS开发和OS X开发中,apple采用了大量的代理模式来实现MVC中的view和controller的解耦。
    怎么实现一个协议?
    @protocol 协议名称<NSObject>//<>代表实现某个协议
    @end
    比如:.h中
    @protocol ButtonDelegate<NSObject>
    -(void)onclick;
    @end
    @interface Button:NSobject
    //delegate就是按钮的监听器
    @property(nonatomic,retain)id <ButtonDelegate> delegate;
    @end

    .m中
    -(void)dealloc{
    [_delegate release];
    [super dealloc];
    }//没有内存泄露

    OC16-Block在iOS4.0就开始出现
    Block封装了一段代码,可以在任何时候执行;
    定义一个Block:int (^Sum) (int,int)=^(inta,intb){
    return a+b;
    };
    int a=sum(10,12);
    BSLog(@“%i”,a);
    //定义了一个叫sum的block对象,带有两个参数,返回int类型,等式右边就是block的实现
    还可以声明一个变量,可以访问局部变量,但是不能修改。
    如果外部变量已经用__block关键字进行了声明,就可以在block内部修改这个变量。

    18Foundation1-常用结构体—NSRange
    包含很多类:NSString,NSarray,NSDictionary等等
    NSRange是用来表示范围的。location表示范围的起始位置;length表示该范围所含的元素个数。
    创建NSRange结构体变量:直接给成员赋值
    NSRange range=NSMakeRange(7,3);最常用
    NSString *str = NSStringFromRange(range);
    NSLog(@“%@”,str);

    NSPoint也是结构体,表示一个点,有x和y。
    创建NSPoint结构体变量:
    p=CGPointMake(3,4);快速创建,最常用的
    NSString *str = NSStringFromPoint(p);
    NSLog(@“%@”,str);

    NSSize表示用来存储宽度和高度
    定义:
    NSSize size;
    size.width = 100;
    size.height = 90;
    NSString *str = NSStringFromSize(size);
    NSLog(@“%@”,str);

    NSRect表示存储位置和尺寸的,已经包含point和size
    NSSize rect;
    rect.origin.x= 10;
    rect.origin.y = 11;
    rect.origin.width= 100;
    rect.origin.height = 90;
    //rect=NSMakeRect(10,11,100,90);//代替上面几行
    //rect=CGRectMake(10,11,100,90);
    NSString *str = NSStringFromRect(rect);
    NSLog(@“%@”,str);

    19.NSString的创建
    直接赋值:NSString *str1= @“A String”;//不需要管理内存,常量字符串创建
    快速创建:NSString *str2 = [[NSString alloc]init];
    或者:NSString *str3 = [[NSString alloc]initWithString:@“A string”];
    静态方法:
    str3 = [NSString stringwithString:@“A string”];不需要管理内存
    或者:
    //这个是使用C语言的字符串来表示
    NSString *str4 = [[NSString alloc]initwithUTF8String:“A string”];
       str4 = [NSString stringwithUTF8String:“A string”];
    或者:NSString *str5 = [[NSString alloc]initwithFormat:@“My age is %i and height is %.2f”,str];
    str5 = [NSString stringwithFormat:@“My age is %i and height is %.2f”,19,1.55f];

    从文件中读取文本
    NSString *path = @“/Users/apple/Desktop/test.txt”;//文件路径
    NSString *str1=[NSString stringwithContentsOfFile:path];//过期的方法不能解析中文
    NSLog(@“%@”,str1);
    还可以用其他不过期的方法:
    //定义一个NSError的变量
    NSError *error;
    NSString *str1=[NSString stringwithContentsOfFile:path encoding: NSUTF8stringEncoding error:error];//UTF8表示指定字符串编码(包含中文)
    if (error=nil){//没有错误信息
    NSLog(@“读取文件成功:%@“,str1);
    }
    else{

    NSLog(@“读取文件失败:%@“,error);
    }

    20Foundation3-指向指针的指针
    void changeStr(NSString **str2){
    *str2=@“123”;
    }
    int main (){
    NSString *str=@“456”;
    changeStr(&str);
    NSLog(@“%@”,str);
    }

    21Foundation4-NSString的导出
    将字符串写入文件
    void stringExport(){
    NSString *str=@“123456”;
    NSString *path=@“/Users/apple/Desktop/test.txt”;
    [str writeToFile:path atomically:Yes  encoding:NSUTF8StringEncoding error:&error];
    if(error){
    //[error locallizeDescription]会返回主要的错误信息
    NSLog(@“写入失败:%@”,error);
    }else {
    NSLog(@“写入成功”);
    }
    }
    //YES代表原子性操作,也就是会创建一个中间的临时文件
    //如果文件不存在,会自动创建文件;如果文件夹不存在,会直接报错
    //编码指定错误也会报错
    int main(){

    stringExport();
    }

    22Foundation5-NSString的常用方法
    (1)NSString大小写方法
    void caseTest(){
    NSString *str=@“GuangDong”;
    //转成大写
    NSLog(@”大写:%@“,[str uppercaseString]);
    //转成小写
    NSLog(@”小写:%@“,[str lowercaseString]);
    //首字母变大写,其他字母变小写
    NSLog(@”首字母变大写,其他字母变小写:%@“,[@”age“ capitalizedString]);}
    int main(){
    @autoreleasepool{
    caseTest();
    }
    return 0;
    }
    (2)NSString的比较
    (BOOL)isEqualToString://比较字符串内容是否相同
    void compare(){
    BOOL result=[@“abc”isEqualToString:@“Abc”];
    NSLog(@“%i”,result);
    }
    //比较两个字符串的大小
    返回值you很多:
    BSOrderdAscending 右边字符串比左边大
    BSOrderdSame两个字符串内容相同
    BSOrderdDecending  左边字符串比右边大
    NSComparisonResult result = [@“abc”]compare:[@“Abc”];
    if(result == BSOrderdSame){
    NSLog(@“两个字符串内容相同”);
    }elseif(result ==BSOrderdAscending){
    NSLog(@“右边大于左边”);
    }elseif(result== BSOrderdDecending ){
    NSLog(@“右边小于左边”);}
    //忽略大小写比较,返回值与compare一样
    NSComparisonResult result=[@“abc”]caseInsensitiveCompare:[@“Abc”];
    (3)NSString搜索字符串
    void search(){
    NSString *str = @“123456.txt”;
    //以什么开头
    NSLog(@“是否以12开头:%i”,[str hasPrefix:@“12”]);
    //以什么结尾
    NSLog(@“是否以txt结尾:%i”,[str hasSuffix:@“txt”]);}
    //查找对应的字符串的位置location,length
    NSRange range = [str rangOfString:@“345”];
    //把一个结构体转为字符串打印
    if(range.location==NSNotFound){
    NSLog(@“找不到”);
    }else{
    NSLog(@“找到的范围是:%@”,NSStringFromRange(range));
    }
    //从尾部开始搜索字符串
    range =[str rangeOfString:@“456” options:NSBackwardsSearch];
    NSLog……
    //指定范围搜索
    NSRange range = [str rangeOfString:”@456” options:NSBackwardsSearch range:@“23456” ];
    (4)NSString的截取
    //从开头到尾部
    substringFromIndex
    void subString(){
    NSString *str = @“123456”;
    //从索引3开截取到尾部
    NSLod(@“%@”,[str subsstringFromIndex:3]);
    //从头部开始截取到索引3之前
    NSLod(@“%@”,[str subsstringToIndex:3]);
    //指定范围进行截取
    NSRange range = NSMakeRange(2,3);//封装对象范围
    NSLod(@“%@”,[str subsstringwithRange:range]);
    //切割字符串
    NSString *str2 = @“1,2,3,4,5”;
     NSArray *array = [str2 componentsSeparatedBystring:@“,”];
    NSLog(@“%@”,array);
    }
    //从array这个集合取出元素
    NSString *str = [array bjectAtIndex:0];
    NSLog(@“%@”,str3);
    (5)NSString与路径(与文件操作有关)
    void pathTest(){
    //快速创建一个自动释放的数组
    NSMutableArray *components = [NSMutableArray array];
    [components addObject:@“Users”];
    [components addObject:@“mj”];
    [components addObject:@“DeskTop”];
    //将数组中的所有字符串拼接成一个路径
    NSString *path = [NSString pathwithComponents:components];
    NSLog(@“%@”,path);
    //将一个路径分解成一个数组
    NSArray *cmps = [path pathComponents];
    NSLog(@“%@”,cmps);
    //是否是绝对路径,依据是前面有无/
    path = @“users/mj/test”;//path是一个字符常量。不可变
    NSLog(@“%i”,[path isAbsoluutePath]);
    //最后一个目录或者文件夹
    NSLog(@“最后一个目录:%@”,[path lastPathComponent]);
    //删除最后一个目录或者文件夹
    NSLog(@“%@”,[path stringByDeletinglastPathComponent]);
    //在最后面拼接一个目录
    NSLog(@“%@”,[path stringByAppendingPathComponent:@“abc”]);
    }
    (6)NSString与拓展名
    void extension(){
    NSString *str = @“/user/mj/test.txt”;
    //获得拓展名
    NSLog(@“拓展名:%@”,[str pathExtension]);
    //删除尾部拓展名
    NSLog(@“%@”,[str stringByDeletingpathExtension]);
    //在尾部添加一个拓展名
    NSLog(@“%@”,[str stringByAppendingpathExtension:@“mp3”]);
    }
    (7)
    NSString其他用法
    void other(){
    NSString *str = @“1”;
    //把一个字符串转为int类型
    int a = [str intvalue];//intvalue可以是doublevalue,longvalue等等
    NSLog(@“%i”,);
    //返回字符串长度,在oc中,计算字数,C语言中,一个汉字占据3个字符,计算字符数
    NSLog(@“length=%zi”,[@“我是字符串”length]);
    //从字符中取出字符
    unichar c = [@“abc” characterAtIndex:0];
    NSLog(@“%c”,c);
    //返回C语言中的字符串
    const char *s = [@“abc”UTF8String];
    NSLog(@“%s”,s);
    }

    23Foundation6-NSMutableString
    创建可变字符串的方法:
    void stringCreate(){
    NSMutableString = [[NSString alloc]initwithcapacity:10];容量//预先分配10个字数的存储空间
    //设置字符串内容
    [str setstring:@“1234”];
    //拼接一个字符串
    [str appending:@“567”];
    //拼接字符串
    [str appendFormat:@“age is %i and height is %.2f”,27,1.55f];
    //替换字符串
    NSRange range = NSMakeRange(7,3);//NSRange range = [str rangeofstring:@“height”];
    [str replacecharacterInRange:range  withstring:@“no”];
    //插入字符串
    [str insertstring:@“abc” atIndex:2];
    //删除字符串
    range = [str rangeofstring:@“age”];
    [str deletecharactersInrange:range];
    NSLog(@“%@”,str);
    }

    24Foundation7-NSArray的创建和遍历
    存储一系列的对象有序,不能存储C语言中的基本数据类型,只能装OC对象
    (1)创建数组方法:(不需要管理内存)
    1NSArray *array = [NSArray array];//创建一个空数组
    2array = [NSArry arraywithobject:@“123”];创建有元素的数组
    3array = [NSArry arraywithobjects:@“a”,@“b”,@“c”];创建多个元素的数组
    unsigned int count =[array count];//查看数组元素的方法//count = array.count;
    (2)数组的基本使用查询
    void arrayuse(){

    NSArray *array = [NSArraywithobjects:@“a”,@“b”,@“c”,nil];
    //判断是否包含某个元素
    if([array contains object:@“a”]){
    NSLog(@“包含了字符串a”);
    }
    返回最后一个元素
    NSString *last = [array lastobject];
    //获得index位置对象的元素
    NSString *str = [array objectAtIndex:1];
    //查找元素的位置
    int index = [array indexofobject:@“c”];
    //在指定范围查找元素的位置
    int index = [array indexofobject:@“c” inRange:@“abc”];
    }
    (3)数组的内存管理
    当把一个对象塞进数组中时,这个对象的计数器会加1,也就是说数组会对它们进行一次retain操作,
    数组被销毁时候会对内部所有元素都做一次release操作。
    (4)NSArray比较
    //比较两个集合内容是否相同
    (BOOL)isequaltoarray:(array *)otherarray;
    //返回两个集合中第一个相同的对象元素
    (id)firstobjectcommonwitharray:(NSArray *)otherarray;
    (5)NSArray给元素发送消息,也就是调用方法
    //让数组里面的所有对象都调用test方法
    [array makeobjectsperformselector:@selector(test)];
    (6)NSArray的遍历方法
    NSArray *array = [NSArraywithobjects:@“1”,@“2”,@“3”,nil];
    int count = array.count;
    1遍历for(int i=0,i<count;i++){
    id obj=[array objectAtIndex:i];
    NSLog(@“%i-%@“,i,obj);
    }
    2快速遍历
    NSArray *array = [NSArraywithobjects:@“1”,@“2”,@“3”,nil];
    int i=0;
    for (id obj in array){
    NSLog(@“%i-%@“,i,obj);
    i++;
    }
    3使用代码块block遍历
    NSArray *array = [NSArraywithobjects:@“1”,@“2”,@“3”,nil];
    [array enumerateobjectsusingblock:^(id obj,NSUInteger idx,BOO*stop){
    NSLog(@“%i-%@“,i,obj);
    if(idx==1){*stop = YES;//遍历停止,利用指针修改BOOL外面的变量
    }
    }];
    4迭代器方式遍历数组
    NSEnumerator *enumerator = [array objectEnumerator];
    //反序迭代器从尾部开始遍历元素
    NSEnumerator *enumerator = [array reverseobjectEnumerator];
    //获取下一个需要遍历的元素
    id obj =nil;
    while (obj=[enumerator nextobject]){
    NSLog(@“obj=%@“,obj);
    };
    //返回这个迭代器的所有元素,allobjects是取出没有被遍历过的对象
    NSArray *array = [enumerator allobjects];

    25Foundation8-NSArray的排序
    1派生出新的数组或者集合
    void arraynew(){
    NSArray *array = [NSArraywithobjects:@“1”,@“2”,nil];

    NSArray *array2= [array arrayByAddingObject:@“3”];
    //nil代表结束
    NSArray *array3= [array arrayByAddingObjectsFromArray:[NSArray arraywithobjects:@“4”,@“6”,nil];

    NSArray *array4 = [NSArraywithobjects:@“1”,@“2”,@“3”,nil];
    NSrange range =NSMakerange(1,2);
     NSArray *array5 = [array4 subarraywithrange:range];
    }
    2其他方法
    NSArray *array = [NSArraywithobjects:@“1”,@“2”,@“3”,nil];
    //把数组中所有元素链接起来拼接成一个字符串
    NSString *str=[array componentsJoinedByString:@“,”];
    //将一个数组写入文件(生成一个XML文件)
    NSString *path=@“usersappledesktoparray.xml”;
    [array writetofile:path atomically:YES];
    //从文件中读取数组内容(文件有严格要求)
    NSArray *array2=[NSArray arraywithcontentsoffile:path];
    3数组排序sort
    NSArray *array = [NSArraywithobjects:@“2”,@“3”,@“4”,nil];
    //返回一个排好序的数组,原来数组元素顺序不会改变,指定元素比较方法
    NSArray *array2=[array sortedArrayusingselector:@selector(compare:)];
    //利用block进行排序
    NSArray *array3=[array sortedArrayusingcomparator:^NSComparisonResult(student *obj,student *obj){

    }

    26Foundation9-NSMutableArray
    可变的NSArray数组的子类,
    初始化:NSMutableArray *array = [NSMutableArray  arraywithobjects:@“a”,@“b”,@“c”,nil];
    添加元素:[array addobject:@“2”];
    1NSMutableArray *array = [NSMutablrArray array];//创建一个空数组
    2NSMutableArray *array = [NSMutableArray arraywithobject:@“123”];创建有元素的数组
    3NSMutableArray *array= [NSMutableArray  arraywithobjects:@“a”,@“b”,@“c”];创建多个元素的数组
    删除元素:
    [array removeobject:@“2”];
    删除所有元素:[array removeallobjects:@“2”];
    删除index位置的元素:
    -(void) removeobjectsAtindex:(NSIndex *)index;
    删除index位置的suoyou元素:
    -(void) removeobject:(id)anobject;
    删除特定元素:
    -(void )removebject:(id)anobject inRange:(NARang)range;
    在range范围内查找特定的元素进行删除:
    -(void )removebjectsinarray:(NSArray *)otherarray;
    删除同时存在于otherArray和当前集合中的所有元素:
    -(void )removebjectsinrange:(NSRange)range;
    替换元素:
    [array replaceobjectatindex:1 withobject:@“4”];
    NSMutableArray的排序:
    [array sortUsingselector:@selector(compare:)];

    27Foundation10-NSDictonary
    字典的作用:通过唯一的key找到对应的value。不可变
    创建字典:
    1初始化方法NSDictionary *dict = [NSDictionary dictionary];
    NSDictionary *dict = [NSDictionary dictionarywithobject:@“v” forkey:@“k”];一对键值对(最常用)
    NSDictionary *dict = [NSDictionary dictionarywithobjectsAndkeys:
    @“v1,@“k1”,
    @“v2,@“k2”,
    @“v3,@“3”,nil];
    NSDictionary *dict = [NSDictionary dictionarywithobjects:objects forkeys:keys];
    2字典的基本使用
    返回字典的key数(多少个键值对)
    -(NSInteger)count;
    id obj = [dict objectforkey:(@“k2”)];取出某个值
    将字典写入文件中:
    NSString *path = @“/user/apple/desktop/dict.xml”;
    [dict writetofile:path atomically:YES];
    从文件中读取内容:
    dict = [NSDictionary dictionarywithcontentsoffile:path];
    NSLog(@“dict=%@,dict”);
    返回所有的key:
    NSArray *array = [dict allkeys];
    返回object的所有key:
    返回所有的value:
    NSArray *objects = [dict allvalues];
    根据多个key取出对应的多个value:当key找不到对应的value时,用marker参数值代替
    objects = [dict objectsforkeys:[NSArray arraywithobjects:@“k1”,@“2”,nil]notfoundmarker:@“not-found”];
    遍历字典:
    void dictfor(){
    NSDictionary *dict = [NSDictionary dictionarywithobjectsandkeys:

    @“v1,@“k1”,
    @“v2,@“k2”,
    @“v3,@“3”,nil
    };
    遍历字典所有key:
    for(id key in dict){
    id value = [dict objectforkey:key];
    }
    in main(){
    void dict();
    }
    2迭代器遍历:
    NSEnumerator *enumer = [dict keyEnumerator];
    id key = nil;
    while(key = [enumer nextobject]){
    id value = [dict objectforkey:key];
    NSLog(@“%@=%@,key,value”);
    //对象迭代器:
    //[dict objectEnumerator];
    }
    3block遍历字典:
    [dict enumeratekeysandobjectsusingblock:
    ^(id key,id obj,BOOL *stop){
    NSLog(@“%@=%@,key,obj”);
    }];
    3字典的内存管理:
    一个对象称为字典的key或者Value时,会做一次retian操作,也就是计数器会加1
    当字典被销毁时,里面的所有key和value都会做一次release操作,也就是计数器会减1
    void dictmemory(){
    student *stu1 = [student studentwithname:@“stu1”];
    student *stu2 = [student studentwithname:@“stu2”];
    student *stu3 = [student studentwithname:@“stu3”];
    NSDictionary *dict = [NSDictionary dictionarywithobjectsandkeys:

    @“stu1,@“k1”,
    @“stu2,@“k2”,
    @“stu3,@“k3”,nil
    };

    28Foundation11-NSMutableDictonary,不存在排序问题
    创建和MSDictionary一样。
    添加元素:
    [dict setobject:stu1 forkey:@“k1”];
    当出现莫名其妙的错误,首先先(项目环境)clean,再运行;
    不行再:第一个,然后build phases(编译环境.m文件的错误,可能少编译一个了)。
    删除所有键值对:
    [dict removeallobjects];
    添加其他字典到当前字典中:
    NSDictionary *other= [NSDictionary dictionarywithobject:@“v2” forkey:@“k2”];
    [dict addentreiesfromdictionary:other];

    29Foundation12-NSNumber
    NSNumber基本数据类型(仅数字类型)包装成对象,这样就可以间接将基本数据类型存进NSArray,NSdictionary等集合中。
    常见的初始化方法:
    void number(){静态方法以类名开头
    NSNumber *number = [NSNumber numberwithint:10];
    NSMutableArray *array = [NSMutablearray array];
    添加数值到数组中
    [array addobject:number];
    取出来还是一个NSNumber对象,不支持自动解包(不会自动转化为int类型)
    NSNumber *number1 = [array lastobject];
    将NSNumber转化成int类型
    int num = [number1 intvalue];
    NSLog(@“num=%i”,num);
    }

    30Foundation13-NSValue包装结构体
    把结构体包装成OC对象。
    NSNumber是NSValue的子类,NSValue可以包装任意值,包装结构体后加入NSArray,NSDictionary等集合中
    CGPoint point = CGPointMake(10,10);
    将结构体变量包装成一个对象
    NSValue *value = [NSValue valuewithpoint:point];
    添加value
    [array add object:value];
    取出当时放进去的value
    NSVaule *value1 = [array lastobject];
    CGPonit point1 = [value1 pointvalue];
    看看point和point1是否一样?同一个?
    BOOL result = CGPonitEqualtopoint(point1,point);
    第二种:
    typed struct{
    int year;
    int month;
    int day;
    }date;
    void value(){
    date = {2014,3,7};
    void *代表一个指针,传结构体的地址&date
    char *type =@encode(date) ;根据结构体类型生成对应的描述字符串
    NSValue  *value = [NSValue value:&date withobjCType:type];
    定义一个结构体变量
    date date1;
    取出包装的结构体
    [value get value:&date1];
    }
    取出类型描述的字符串
    [value objType];

    31Foundation14-NSNull
    集合中不能存放nil值的,因为nil在集合中有特殊含义,但是有时候需要表达什么都没有就使用NSNull,
    也是NSObject的一个子类。
    创建和获取:
    NSNull *n = [NSNull null];全局只有一个实例就是单例。返回永远只有一个值
    NSNull *n1 = [NSNull null];
    NSNull *n2 = [NSNull null];

    32Foundation15-NSDate
    1NSDate的静态初始化:
    NSdate *date = [NSdate date];
    //now:11:12:40
    //date:11:12:50
    date = [NSDate datewithTimeIntervalsinceNow:10];
    date = []NSDate datewithTimeIntervalSince1970:10;
    date = [NSDate distantFuture];返回一个将来的时间,随机的
    date = [NSDte distantpast];返回一个比较遥远的过去时间
    2NSDate的基本使用
    NSdate *date = [NSdate date];
    [date timeIntervalSince1970];返回19701月1日开始走过的时间
    跟其他时间进行对比
    [date timeIntervalSincedate:(NSDate *)];
    返回比较早的时间
    [date earlierdate:date];
    返回比较晚的时间
    [date laterdate:date];
    3void dateformat(){格式化
    NSdate *date = [NSdate date];
    //2013-04-07 11:12;35
    NSDateformatter *formatter = [[NSDateformatter alloc]init];
    formatter.dateformat = @“yyyy-MM-dd HH:mm:ss”;//HH是24进制,hh是12进制
    }

    33Foundation16-NSObject和反射
    NSObject是基类。
     student *stu = [[[student alloc]init]autorelease];
    //iskindof判断对象是否属于某个类或者子类
    if([stu iskindofclass:[person class]]){
    NSLog(@“stu属于Person或者继承自person”);
    };
    //ismemberof判断对象是否属于某个类(不包括子类)
    BOOL result = [stu ismenberofclass:[student class]];
    NSLog(@“%i”,result);
    直接调用
    [stu test];
    间接调用
    [stu performselector:@selector(test)];
    [stu performselector:@selector(test2:) withobject:@“abc”];必须是OC对象
    [stu performselector:@selector(test2:) withobject:@“abc” afterdelay:2];
    反射:
    void reflect(){
    //类名的反射
    NSString *string = @“person”;
    class class = NSClassfromstring(str);
    person *person = [[class alloc]init;
    NSLog(@“%@”,person);
    [person release];
    //class变成字符串
    NSString *name = NSStringfromclass([person class]);
    //方法的反射
    NSString *method = @“test”;
    SEL selector = NSSelectorfromstring(method);
    [person performselector:selector];
    将SEL转换为字符串
    NSString *selectorname = NSStringfromselector(selector);
    }

    34OC18-copy语法copy和mutablecopy拷贝
    一个对象使用copy或者mutable copy方法可以创建对象的副本
    copy 需要先实现NSCoppying协议,创建的是不可变副本如NSString,NSArray,NSDictionary
    mutblecopy  需要先实现NSMutablecopying协议,创建的是可变的副本,如
    NSMutablestring,NSMutableArray,NSMutableDictionary.
    深复制:内容拷贝,源对象和副本指向不同的两个对象,源对象引用计数器不变,副本计数器设置为1.
    浅复制:指针拷贝(地址),源对象和副本指向的是同一个对象,对象的引用计数器加1,其实相当于做了一次retain操作
    只有不可变对象创建不可变副本才是浅复制,其他都是深复制。
    void stringmutablecopy(){深拷贝

    NSString *string = [[NSString alloc]initwithformat:@“age is %i”,10];
    产生一个新的对象,计数器为1,源对象计数器不变
    NSMutablestring *str = [string mutablecopy];

    [str appendstring:@“abcd”];

    [str release];
    [string release];
    }

    void stringcopy(){浅拷贝不可变对象调用copy方法
    NSString *string = [[NSString alloc]initwithformat:@“age is %i”,10];
    没有产生一个新的对象,源对象计数器加1
    NSstring *str = [string copy];
    [string release];
    }

    copy的目的:改变副本时候,不会影响到源对象
    //copy代表set方法会release旧对象,copy新对象
    retain代表set方法会release旧对象,copy新对象内部的成员变量
    string用copy策略,其他对象一般用retain。
    修改外面的变量,并不会影响到内部的变量。

    @property(nonatmic,copy)NSString *name;
    演示student的name的copy:
    void studentnamecopy(){
    student *stu =[[ [student alloc]init]autorelease];
    NSMutablestring*string = [NSMutablestring stringwithdormat:@“age is %i”,10];
    stu.name = string;
    [string appendstring:@”abcd”];
    NSLog(@“name=%@”,stu.name);
    NSLog(@“string=%@”,string);
    }
    在main.m文件中
    演示student的copy:
    void studentcopy(){
    student *stu1 =[ [student student withname:@“stu1”];
    student *stu2 = [stu1 copy];
    [stu2 release];
    }

    在student.m文件中
    +(id)studentwithname:(NSString *)name {
    student *stu = [[[student alloc]init]autorelease];
    stu.name = name;
    return stu;
    }
    -(void)dealloc{
    [_name release];
    [super dealloc];
    }
    copying协议方法:
    -(id)copywithzone:(NSZone *)zone{//alloc是分配存储空间的意思
    student *copy = [[student allocwithzone:zone]init];
    copy.name = self.name;拷贝名字给副本对象

    }
    @end


     

  • 相关阅读:
    Linux程序的执行
    Linux图形操作与命令行
    Linux网络配置
    Zip文件中文乱码问题解决方法(MAC->Windows)
    我只是一直很努力
    Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
    Android抓包方法(二)之Tcpdump命令+Wireshark
    Android抓包方法(一)之Fiddler代理
    Android反编译(二)之反编译XML资源文件
    Android反编译(一)之反编译JAVA源码
  • 原文地址:https://www.cnblogs.com/linxiu-0925/p/5055460.html
Copyright © 2011-2022 走看看