码迷,mamicode.com
首页 > 其他好文 > 详细

OC杂记,1214

时间:2014-12-18 13:25:49      阅读:343      评论:0      收藏:0      [点我收藏+]

标签:des   http   ar   io   os   使用   sp   for   java   

1,os快捷键

Command(长按)+ tab,切换程序窗口。

Command(长按)+空格,切换输入法。

 

2,预处理指令的作用范围是从他出现的位置到文件的尾,C语言提供的预处理指令主要有:宏定义,文件包含,条件编译,#include"",系统会先在源程序当前目录下寻找,找不到再会去操作系统的path路径中查找,最后才去C语言函数头文件所在目录中查找。#include指令允许嵌套包含,比如a.h包含b.h,b.h包含c.h,但是不允许递归包含,比如 a.h 包含 b.h,b.h 包含 a.h。使用#ifndef _DSD_H_,#define _DSD_H_,防止内容被重复包含。#import可以自动防止同一个文件被导入多次

 

3,weak与strong

  3.1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;
  3.2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针
 
  只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。
 
  在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},  子类中又调用了父类{子类又retain了父类},这样都无法release)
 

  weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的  ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController

                           bubuko.com,布布扣

  strong和weak指针的使用注意。

  下面代码是有问题的:    

  1. __weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];  
  2. NSLog(@"%@", str); // 打印出来是"(null)"  

  str是个weak指针,所以NSString对象没有拥有者,在创建之后就会被立即释放。Xcode还会给出警告("Warning: Assigning retained object to weak variable; object will be       released after assignment")

 

 

4,self:

谁调用self,self就指向谁
Self关键字一定是类的方法中使用

 

5,多态,多态依赖于继承关系而存在,用父类的指针保存了子类的对象。传入的是哪个对象就会调用哪个对象的方法。

 

6,属性生成器

  @property     自动生成属性声明
  @synthesize  自动生成属性实现,Xcode4.3之后就不需要写了
 
7,数组的切分
 
  使用componentSeparateByString: 来切分NSArray,用componentsJoinedByString来合并,例如
     NSString *ss = @"opp:ack:dwdew:oooo";
    NSArray *ass = [ss componentsSeparatedByString:@":"];
    for (NSString *tt in ass) {
        NSLog(@"==%@\n",tt);
    }
  
    NSString *heBing = [ass componentsJoinedByString:@":"];
    NSLog(@"----%@",heBing);
    /*
     2014-12-16 09:10:07.101 basicOC[837:12532] ==opp
     2014-12-16 09:10:07.102 basicOC[837:12532] ==ack
     2014-12-16 09:10:07.102 basicOC[837:12532] ==dwdew
     2014-12-16 09:10:07.103 basicOC[837:12532] ==oooo
     2014-12-16 09:10:07.103 basicOC[837:12532] ----opp:ack:dwdew:oooo
     */ 
 
8,将数组写入文件,NSString ,NSDictionary,NSData也具有类似的功能。 NSArray 的情况如下:
 //    NSArray *test = @[@"1rrw",@"2rrw",@"r3rw",@"rr4w",@"r5rw",];
//    [test writeToFile:@"/Users/god_love_yao/Desktop/test/basicOC/basicOC/deren.txt" atomically:1];

    NSArray *test2 = [NSArray arrayWithContentsOfFile:@"/Users/god_love_yao/Desktop/test/basicOC/basicOC/deren.txt"];
    for (NSString *tt in test2) {
        NSLog(@"===%@\n",tt);
    }
    /*
     2014-12-16 09:50:26.681 basicOC[1578:27734] ===1rrw
     2014-12-16 09:50:26.682 basicOC[1578:27734] ===2rrw
     2014-12-16 09:50:26.682 basicOC[1578:27734] ===r3rw
     2014-12-16 09:50:26.682 basicOC[1578:27734] ===rr4w
     2014-12-16 09:50:26.682 basicOC[1578:27734] ===r5rw
     */ 
 
 9 copy和mutableCopy
 
copy复制返回的对象是不可变的,mutableCopy则是可变的。(不管以什么样的指针去接收)。
 
<1>  复制的对象为系统的非容器类对象:NSString、NSNumber等等。
  当被复制的对象是不可变的时候,使用copy得到的对象在堆区的地址是一样的(浅复制)。使用mutableCopy得到的在堆区的地址是不一样的(深复制)(新建了一块空间),例如NSString为例,
     NSString *s1 = @"deren";  //被复制的对象是不可变
    
    NSString *s2 = [s1 copy];  //这里如果以NSMutableString 来接收的话得到对象还是不可变的,如果修改(“deren”)的话程序会崩了。
    NSMutableString *s3 = [s1 mutableCopy];  //这里以NSString 来接收好像没什么大的关系。
    
    NSLog(@"&s1==%p,&s2==%p,&s3==%p\n",&s1,&s2,&s3);  //栈区的地址。
    NSLog(@"s1==%p,s2==%p,s3==%p",s1,s2,s3);    //堆区的地址。
    
    /*
     2014-12-16 10:49:30.518 basicOC[2217:42363] &s1==0x7fff55947a98,&s2==0x7fff55947a90,&s3==0x7fff55947a88
     2014-12-16 10:49:30.519 basicOC[2217:42363] s1==0x10a2b8068,s2==0x10a2b8068,s3==0x7f8b80c6be10
     */ 
   
  当被复制的对象是可变的时候,使用copy和mutableCopy返回的对象在堆区都不一样(深复制)例如:  

  NSMutableString *s1 = [NSMutableString stringWithString:@"dw"];    //被复制的对象是可变

  NSString *s2 = [s1 copy];
  NSMutableString *s21 = [s1 copy];

  NSString *s31 = [s1 mutableCopy];
  NSMutableString *s3 = [s1 mutableCopy];

  NSLog(@"&s1==%p,&s2==%p,&s21==%p,&s3==%p,&s31==%p,\n",&s1,&s2,&s21,&s3,&s31);
  NSLog(@"s1==%p,s2==%p,s21==%p,s3==%p,s31==%p,\n",s1,s2,s21,s3,s31);
/*
2014-12-16 14:32:55.062 basicOC[3119:68992] &s1==0x7fff54f75a98,&s2==0x7fff54f75a90,&s21==0x7fff54f75a88,&s3==0x7fff54f75a78,&s31==0x7fff54f75a80,
2014-12-16 14:32:55.063 basicOC[3119:68992] s1==0x7fe4b1e97750,s2==0x7fe4b1e978a0,s21==0x7fe4b1e97570,s3==0x7fe4b1e993d0,s31==0x7fe4b1e97640, 
*/

 

<2>  复制的对象为系统的容器类对象:NSArray、NSDictionary等等。对于容器类本身,上面讨论的结论也是适用的

  当被复制的对象是不可变的时候,使用copy得到的对象在堆区的地址是一样的(浅复制)。使用mutableCopy得到的在堆区的地址是不一样的(深复制)(新建了一块空间),

  当被复制的对象是可变的时候,使用copy和mutableCopy返回的对象在堆区都不一样(深复制)例如:

    NSString *ss1 = @"daa123";//  NSString改为 NSMutableString 也一样

    NSString *ss2 = @"frgre";//    NSString改为 NSMutableString 也一样
    
    NSArray *array1 = [NSArray arrayWithObjects:ss1,ss2, nil];
    NSMutableArray *marray1 = [NSMutableArray arrayWithObjects:ss1,ss2, nil];
    
    NSArray *carray1 = [array1 copy];//= = =
    NSArray *carray2 = [array1 mutableCopy];//x = =
    NSMutableArray *carray3 = [array1 copy];//= = =
    NSMutableArray *carray4 = [array1 mutableCopy];//x = =
    
    NSArray *carray1 = [marray1 copy];//x = =
    NSArray *carray2 = [marray1 mutableCopy];//x = =
    NSMutableArray *carray3 = [marray1 copy];//x = =
    NSMutableArray *carray4 = [marray1 mutableCopy];//x = = 
 
(后面注释”x = =“表示复制返回的数组指针不一样,数组里的对象1一样,对象2一样)
 
从中可以看出数组的复制不管怎么样复制,只是有的(取决于被复制的对象是否可变)指针复制了,但装在数组里面的对象都没有复制。    
 
    a,产生一个对象的可变副本并不要求被复制的对象本身是可变的。也可以创建可变对象的不可变副本。
    b,在产生数组的副本时,数组中每个元素的保持计数将通过复制操作自动增 1。所以,需要[release]; 释放它的内存
 
 
10,归档和解归档:
  <1>单个对象的归档,过程如下:
     NSString *homeDirectory = NSHomeDirectory();//E7BABD79-EA1A-491F-A700-9E8409845D1E,这里二次获得目录最后一级不一样,所以下面删了最后一级目录,
                                                          //194008ED-75DA-428E-8E8D-3D596421B297
    NSString *last = [homeDirectory stringByDeletingLastPathComponent];    //删除最后一级目录
    
    
    NSString *filePath = [last stringByAppendingString:@"/aaaa.h"];
//    NSArray *array = @[@"hello",@"world",@"!",@"-----"];
//    if ([NSKeyedArchiver archiveRootObject:array toFile:filePath]) {
//        NSLog(@"filePath==%@",filePath);
//    };

    NSArray *getArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"---==%@",getArray); 
 
 
  <2>多个对象的归档,过程如下:
  
     NSString *homeDirectory = NSHomeDirectory();
    NSString *last = [homeDirectory stringByDeletingLastPathComponent];
    NSString *filePath = [last stringByAppendingString:@"/aaaa.h"];
    
//    NSMutableData *archiData = [[NSMutableData alloc]init];
//    NSKeyedArchiver *archi = [[NSKeyedArchiver alloc]initForWritingWithMutableData:archiData];
//    [archi encodeObject:@"hello" forKey:@"hello"];
//    [archi encodeInt:123 forKey:@"123"];
//    [archi encodeObject:@"nice good" forKey:@"good"];
//    [archi finishEncoding];
//    if([archiData writeToFile:filePath atomically:1])
//    {
//        NSLog(@"------");
//    };
    
    NSMutableData *unArchiData = [[NSMutableData alloc]initWithContentsOfFile:filePath];
    NSKeyedUnarchiver *unArchi = [[NSKeyedUnarchiver alloc]initForReadingWithData:unArchiData];
    NSLog(@"---=%@\n---=%d\n---=%@\n",[unArchi decodeObjectForKey:@"hello"],[unArchi decodeIntForKey:@"123"],[unArchi decodeObjectForKey:@"good"]);
    
    /*
     2014-12-18 11:24:56.746 basicOC[1126:25658] ---=hello
     ---=123
     ---=nice good
     */ 
 
 

 

 

OC杂记,1214

标签:des   http   ar   io   os   使用   sp   for   java   

原文地址:http://www.cnblogs.com/god-love-yao/p/4171315.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!