第一、NSAutoreleasePool自己主动释放池解析





1、自己主动释放池的物理实现





自己主动释放池用栈来实现。当你创建一个新的自己主动释放池是,会压栈到栈顶。接受autorelease消息的对象也会被压入到栈顶

NSAutoreleasePool实现延时释放,内部包括一个数组(NSMutableArray)。用来保存声名为autorelease的全部对象。假设一个对象声明为autorelease,系统所做的工作就是把这个对象增加到这个数组中去。

NSAutoreleasePool自身在销毁的时候,会遍历一遍这个数 组,release数组中的每一个成员,假设release之后,retain count大于0。此对象依旧没有被销毁,内存泄露。

2、当我们使用copy、alloc、retain得到一个对象时。必须调用release或者是autorelease进行释放。其它方法获得对象将由自己主动释放池释放





3、release和drain的差别





当我们向自己主动调用【pool release 】时,池内元素都会调用release方法,而且池释放掉。可是当我们调用drain方法时,仅仅会运行前者





4、自己主动释放池的销毁时间





当我们使用appkit创建project时,程序会自己主动创建或排空自己主动释放池的对象,通常实在一个时间循环中创建,在结束时排空





5、自己主动释放池的作用域与嵌套

AutoreleasePool是能够嵌套使用的,池是被嵌套的。嵌套的结果是个栈,同一线程仅仅有当前栈顶pool实例是可用的:

 当短生命周期内,比方一个循环中。会产生大量的暂时内存,能够创建一个暂时的autorelease pool。这样能够达到高速回收内存的目的。

 NSAutoreleasePool *pool;

    pool=[[NSAutoreleasePool alloc] init];

    {

        for (int i=0; i<100000; i++)

        {

            NSObject *obj=[[[NSObject alloc] init] autorelease];

            NSLog(@"the obj is%@",obj);





            if(i%10000==0)

            {

                [pool drain];

                pool=[[NSAutoreleasePool alloc] init];





            }

        }

    }

    [pool drain];





6、自己主动释放池带来的问题

Cocoa应用程序中的每一个线程都会维护一个自己的NSAutoreleasePool对象的堆栈。当一个线程终止时。它会自己主动地释放全部与自身相关的自己主动释放池。在基于Application Kit的应用程序中。自己主动释放池会在程序的主线程中被自己主动创建和销毁。

● 假设你正在编写一个不是基于Application Kit的程序,比方命令行工具,则没有对自己主动释放池的内置支持。你必须自己创建它们。

● 假设你生成了一个从属线程,则一旦该线程開始运行,你必须马上创建你自己的自己主动释放池。否则,你将会泄漏对象。

● 假设你编写了一个循环,当中创建了很多暂时对象。你能够在循环内部创建一个自己主动释放池,以便在下次迭代之前销毁这些对象。

这能够帮助降低应用程序的最大内存占用量

 第四、IOS内存管理的三句话

谁创建,谁释放:

解释:通过alloc、new、copy创建的对象,必须调用release、autorelease释放

谁retain,谁释放

retain的次数和release、autorelease次数同样

没创建且没有retain,别释放





第二、Foundation FrameWork





定义了多种与基本数据类型类型相应的类,如NSNumber,NSInteger,NSString等,全部从NSSobject继承创建都是对象





NSArray/NSMutalbeArray, NSDictionary/NSDictionary 包括的对象仅仅能是对象。不能使基本数据类型,应採用NSNumber





mutable表示内容可变,非mubable

NSString和NSMutableString





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

{

    //NSArray *colors=[NSArray arrayWithObjects:@"hello",@"richard",@"yang", nil];

    NSString *str=[NSString stringWithFormat:@"hello,richard,yang"];

    NSArray *arr=[str componentsSeparatedByString:@","];

    NSLog(@"retaincount is% ld",[str retainCount]);

    for(int i=0;i<arr.count;i++)

    {

        NSLog(@"The element is %s",[[arr objectAtIndex:i] UTF8String]);

    }

    NSNumber *myNum=[NSNumber numberWithInt:3];

    NSLog(@"the val is %@",myNum);

    

    NSMutableArray *array=[[NSMutableArray alloc] initWithCapacity:4];

    [array addObject:@"hello"];

    [array insertObject:@"what " atIndex:1];

    NSLog(@"THE LAST IS %@",[array lastObject]);

    return 0;

}





关于上述代码的几点说明:

1.用类方法创建的对象。不须要release,会自己主动释放。用实例方法创建的对象须要release





2.NSArray和NSDictionary能够放各种类型的对象。但不能放基本类型





3.调用函数返回值是对象类型,不须要考虑内存释放的问题,普通情况下这样的返回值会autorelease。遵循谁创建谁释放的原则





第三、NSDictionary 和 NSMutableDictionary 经常用法具体解释

dictionaryWithObjectsAndKeys 用来初始化

objectForKey 用来取值

sample:

NSDictionary *testDic=[NSDictionary dictionaryWithObjectsAndKeys:@"1",@"hello",@"2",@"what", nil];

    NSLog(@"val is %@",[testDic objectForKey:@"hello"]);

NSMutableDictionary可变字典NSMutableDictionary继承自NSDictionary





经常使用api:

dictionaryWithCapacity: 用来初始化

setObject: 设置

removeObjectForKey 删除

[count] 返回字典的数量

[allKeys]获取全部键的集合

[allValues】获取全部值得集合

sample:

NSMutableDictionary *testDic=[NSMutableDictionary dictionaryWithCapacity:12];

        [testDic setObject:@"1" forKey:@"hel"];

        [testDic setObject:@"2da" forKey:@"what"];

        [testDic setObject:@"hello" forKey:@"hello"];

        NSLog(@"the val is %@",[testDic objectForKey:@"what"]);

        NSLog(@"the length is %ld",[testDic count]);

        [testDic removeObjectForKey:@"hello"];

        NSLog(@"the length is %lu",testDic.count);

        

        NSArray *keyArray=[testDic allKeys];

        NSArray *valArray=[testDic allValues];

        NSLog(@"the all keys are %@",keyArray);

        NSLog(@"the all values are %@",valArray);

    }





</span>





返回结果是:

2013-10-09 17:20:19.533 element[401:303] the val is 2da

2013-10-09 17:20:19.535 element[401:303] the length is 3

2013-10-09 17:20:19.536 element[401:303] the length is 2

2013-10-09 17:20:19.537 element[401:303] the all keys are (

    what,

    hel

)

2013-10-09 17:20:19.537 element[401:303] the all values are (

    2da,

    1

)

不经经常使用的方法为

- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary;

- (void)removeAllObjects;

- (void)removeObjectsForKeys:(NSArray *)keyArray;

- (void)setDictionary:(NSDictionary *)otherDictionary;

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)keyNS_AVAILABLE(10_8,6_0);

sample例如以下:

NSMutableDictionary *emptyDic=[NSMutableDictionary dictionary];

        [emptyDic setValue:@"2" forKey:@"2"];

        NSLog(@"empty DIC is %@",emptyDic);

        NSMutableDictionary *testDic=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"hello",@"1",@"andy",@"2",@"yang",@"3",nil];

        

        NSDictionary *dic4=[NSDictionary dictionaryWithObject:@"yang" forKey:@"4"];

        [testDic addEntriesFromDictionary:dic4];

        NSLog(@"the mutalble dictionary is %@",testDic);

        [emptyDic setDictionary:testDic];

        NSLog(@"empty DIC is %@",emptyDic);

        

        NSArray *deleteArr=[NSArray arrayWithObjects:@"1",@"2",@"yang",nil];

        [testDic removeObjectsForKeys:deleteArr];

        NSLog(@"the mutalble dictionary is %@",testDic);

        

        [testDic removeAllObjects];

        NSLog(@"the mutalble dictionary is %@",testDic);









结果:

2013-10-09 17:39:37.832 element[463:303] empty DIC is {

    2 = 2;

}

2013-10-09 17:39:37.834 element[463:303] the mutalble dictionary is {

    1 = hello;

    2 = andy;

    3 = yang;

    4 = yang;

}

2013-10-09 17:39:37.834 element[463:303] empty DIC is {

    1 = hello;

    2 = andy;

    3 = yang;

    4 = yang;

}

2013-10-09 17:39:37.835 element[463:303] the mutalble dictionary is {

    3 = yang;

    4 = yang;

}

2013-10-09 17:39:37.835 element[463:303] the mutalble dictionary is {

}





遍历字典的方法:

for(id key in dic)

{

 id obj=[dic objectForKey:key];

NSLog(@"%@",obj);

}

一般的枚举

        NSMutableDictionary *testDic=[NSMutableDictionarydictionaryWithObjectsAndKeys:@"hello",@"1",@"andy",@"2",@"yang",@"3",nil];

        for(int index=0;index<[testDiccount];index++)

        {

            NSString *obj=[testDic objectForKey:[[testDic allKeys] objectAtIndex:index]];

            NSLog(@"the val is %@",obj);

        }

        

        for(id key in testDic)

        {

            NSString *obj2=[testDic objectForKey:key];

            NSLog(@"the val is %@",obj2);

        }

第四、NSString 和NSMutableString 使用技巧

1、字符串的创建

创建简单字符串

NSString *string=@"hello";

创建空字符串

NSString *str2=[[NSStringalloc] init];

NSString *str3=[NSString string];

创建格式化字符串 

NSString *str5=[NSString stringWithFormat:@"hello %d",34]; //是在堆创建的

当用“==”来推断两个字符串时,实际上是推断地址是否同样

以下三个初始化语句的都是在常量区创建的

NSString *string1=@"hello";

NSString *string2=[NSString stringWithString:@"hello"];

NSString *string1=[[NSString alloc] initWithString:@"hello"];

if (string1==string2) {

NSLog(@"they are same");

}

/**

* 字符串的格式化stringWithFormat 

*/

NSString *str=[NSString stringWithFormat:@"我%d",7];

NSLog(@"str:%@",str);

/*

*length supoort chinese

*/

unsigned int lengh=(unsigned int)[str length];

NSLog(@"length:%d",lengh);

/*

*定义个string对象,最好初始化,

*/

NSString *str2=@"我7";





stringwithcapacity 用来初始化NSMutableString





2、字符串的比較

compare、isEqualToString :用来做比較

if([str isEqualToString:str2])

{

NSLog(@"They are the same");

}

/*

* 不区分大写和小写 compare options

*/

NSString *str3=@"Block";

NSString *str4=@"block";

if([str3 compare:str4 options:NSCaseInsensitiveSearch]==0)

{

NSLog(@"insensitive same");

}









3、字符串和float、int型的转换

[str floatValue] 转换为float型,[str invValue] 转换为整型 

componentsSeparatedByString实现将字符串切割为数组

NSString *test=[NSString stringWithFormat:@"3.14"];

float f=[test floatValue];

NSLog(@"float val is %.2f",f);





int i=[test intValue];

NSLog(@"the int val is %i",i);





NSString *str=[NSString stringWithFormat:@"one two three"];

NSArray *arr=[str componentsSeparatedByString:@" "];

NSLog(@"the arr is %@",arr);









4、截取字符串





substringFromIndex、

substringToIndex、

substringWithRange

NSString *str=[NSString stringWithFormat:@"onetwothree"];

NSString *substr=[str substringFromIndex:2];

NSString *substr2=[str substringToIndex:3];

NSLog(@"the arr is %@",substr);

NSLog(@"the arr is %@",substr2);

NSRange range;

range.length=4;

range.location=2;

NSString *substr3=[str substringWithRange:range];

NSLog(@"the arr is %@",substr3);





5、推断是否有前缀

hasprefix. hasSuffix: 用来推断是否有前后缀

NSString *str5=@"draft-hello.mov";

NSString *str6=@"draft";

NSString *str7=@"mov";

if([str5 hasPrefix:str6])

{

NSLog(@"str5 has prefix str6");

}

if([str5 hasSuffix:str7])

{

NSLog(@"str5 has suffix str7");

}





6、字符串的拼接

appendString,appendFormat 用来实现追加

*appendString 和 appendFormat实现追加

*/

[mulstr appendString:@"hello"];

NSLog(@"%@",mulstr);

[mulstr appendFormat:@"hello %d",12];

NSLog(@"%@",mulstr);





NSString *str=[NSString stringWithFormat:@"onetwothree"];

NSString *substr2=[str substringToIndex:3];

NSString *substr3=[substr2 stringByAppendingString:@"hello"];

NSLog(@"the arr is %@",substr3);













7、deleteCharactersInRange 实现删除

/*

* deleteCharactersInRange 运行删除操作

*/

NSRange jackRange;

jackRange=[mulstr rangeOfString:@"ello"];

//jackRange.length++;

[mulstr deleteCharactersInRange:jackRange];

NSLog(@"mulstr:%@",mulstr);





- (void)deleteCharactersInRange:(NSRange)range; 删除字符串

        NSMutableString *str1=[NSMutableString stringWithFormat:

        @"hello what is your name?"];

        NSRange range;

        range=[str1 rangeOfString:@"what"];

        NSLog(@"start is %lu,length is %lu",range.location,range.length);

        [str1 deleteCharactersInRange:range];

        NSLog(@"str is %@",str1);









8、字符串的查询

rangeOfString 用来做查询

typedef struct _NSRange {

     NSUInteger location;  //開始位置

    NSUInteger length;  //长度

} NSRange;

NSRange的定义:

        NSRange range2;

        range2.location = 17;

        range2.length = 4;

        NSLog(@"%lu and  %lu",range2.location,range2.length);

        //用NSMakeRange来初始化

        NSRange rang1=NSMakeRange(12, 23);

        NSLog(@" %lu and %lu",rang1.location,rang1.length);





NSString *str=[NSString stringWithFormat:@"onetwothree"];

NSRange range=[str rangeOfString:@"two"];

if(range.location!=NSNotFound)

{

NSLog(@"the arr is %@",str);

}else

{

NSLog(@"hello");

}









9、NSMutableString 实现字符串的插入

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;

- (void)deleteCharactersInRange:(NSRange)range;





10、改变大写和小写





NSString *myString=@"hello WOrld";

NSLog(@"the upper string is %@",[myString uppercaseString]);

NSLog(@"the lower string is %@",[myString lowercaseString]);

NSLog(@"the cap string is %@",[myString capitalizedString]);





第五、NSArray和NSMutableArray的具体解释

NSArray有两个限制。首先,仅仅能存储objective c的对象,不能存储c语言的基本语言类型,第二。不能包括nil对象

NSArray的使用方法:

1、初始化

NSArray *firstArray=[[NSArray alloc] initWithObjects:@"one",@"two",@"three", nil];

        NSArray *secondArray=[NSArray arrayWithArray:firstArray];





2、获取元素个数和訪问

        NSLog(@"the number is %ld",[secondArray count]);

        NSLog(@"the value is %@",[secondArray objectAtIndex:2]);





3、追加数据元素

        NSArray *thirdArray=[firstArray arrayByAddingObjectsFromArray:secondArray];





4、数组转化为字符串

        NSString *str=[firstArray componentsJoinedByString:@".."];

        NSLog(@"the number is %@",str);





5、推断是否包括字符串

        NSArray *firstArray=[[NSArray alloc] initWithObjects:@"one",@"two",@"three", nil];

        NSLog(@"has value %d",[firstArray containsObject:@"two"]);

        NSLog(@"has value %ld",[firstArray indexOfObject:@"two"]);

        NSLog(@"the last object is %@",[firstArray lastObject]);





NSMutalbeArray 的使用方法-

NSMutableArray是可变的,NSArray是不可变的





6、主要的增删改

     NSMutableArray *mutableArr=[NSMutableArray arrayWithCapacity:4];

        [mutableArr addObject:@"hello"];

        [mutableArr addObject:@"hello"];

        [mutableArr addObject:@"hello"];





        [mutableArr addObject:@"richard"];

        [mutableArr insertObject:@"yang" atIndex:1];

        NSLog(@"%@",mutableArr);

        [mutableArr removeObject:@"hello"];

        [mutableArr removeObjectAtIndex:0];

        [mutableArr removeLastObject];

        NSLog(@"%@",mutableArr);





7、替换操作

        [mutableArr replaceObjectAtIndex:0 withObject:@"kaixin"];





8、遍历

        NSMutableArray *mutableArr=[NSMutableArray arrayWithCapacity:4];

        [mutableArr addObject:@"hello"];

        [mutableArr addObject:@"hello"];

        [mutableArr addObject:@"hello"];

        for(int index=0;index<[mutableArr count];index++)

        {

            NSLog(@"the val is %@",[mutableArr objectAtIndex:index]);

        }

        for(NSString *str in mutableArr)

        {

            NSLog(@"%@",str);

        }

        for (id str in mutableArr) {

            NSLog(@"%@",str);

        }

第五、NSNumber的使用

基本数据类型无法用于字典、集合和数组。为此。我们须要将基本数据类型封装成数字对象。在OC中提供了NSNumber解决此问题

1、NSNumber封装的代码:

        int age=12;

        NSNumber *num1=[NSNumber numberWithInt:age];

        NSNumber *num2=[NSNumber numberWithFloat:10.8];

        NSLog(@"the val is %@",num1);

        NSLog(@"the val is %@",num2);

        NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:num1,@"age",num2,@"info", nil];

        // insert code here...

        NSLog(@"%@",dic);

        NSLog(@"Hello, World!");





结果为:

2013-10-08 17:50:58.777 element[1731:303] the val is 12

2013-10-08 17:50:58.779 element[1731:303] the val is 10.8

2013-10-08 17:50:58.779 element[1731:303] {

    age = 12;

    info = "10.8";

}

2013-10-08 17:50:58.780 element[1731:303] Hello, World!









2、NSNumber解析的代码:

        int age=12;

        NSNumber *num1=[NSNumber numberWithInt:age];

        NSNumber *num2=[NSNumber numberWithFloat:10.8];

        NSLog(@"the num is %d",[num1 intValue]);

        NSLog(@"the num is %d",[num2 intValue]);

    }





 创建和初始化类的方法  初始化实例方法     检索实例方法

 numberWithChar:     initWithChar:   charValue

 numberWithUnsignedChar:     initWithUnsignedChar:   unsignedCharValue

 numberWithShort:    initWithShort:  shortValue

 numberWithUnsignedShort:    initWithUnsignedShort:  unsignedShortValue

 numberWithInteger:  initWithInteger:    integerValue

 numberWithUnsignedInteger:  initWithUnsignedInteger:    unsignedIntegerValue

 numberWithInt:  initWithInt:    intValueunsigned

 numberWithUnsignedInt:  initWithUnsignedInt:    unsignedIntValue

 numberWithLong:     initWithLong:   longValue

 numberWithUnsignedLong:     initWithUnsignedLong:   unsignedLongValue

 numberWithLongLong:     initWithLongLong:   longlongValue

 numberWithUnsignedLongLong:     initWithUnsignedLongLong:   unsignedLongLongValue

 numberWithFloat:    initWithFloat:  floatValue

 numberWithDouble:   initWithDouble:     doubleValue

 numberWithBool:     initWithBool:   boolValue

Foundation框架经常使用数据类型和NSAutoreleasePool自己主动释放池解析的更多相关文章

  1. Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver

    ========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...

  2. (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...

  3. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...

  4. (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...

  5. OC学习篇之---Foundation框架中的NSDictionary类以及NSMutableDictionary类

    今天来看一下Foundation框架中的NSDictionary类,NSMutableDictionary类,这个和Java中的Map类很想,OC中叫字典,Java中叫Map,还有字典是无序的,这个和 ...

  6. OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...

  7. OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...

  8. Java数据类型和MySql数据类型对应一览

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

  9. 数据类型和typeof操作符

    虽然学习js有一段时间了,但是对js的基础语法却是有些生疏.最近在看jquery源码,决定随带总结一些基础的语法知识.今天总结一下数据类型和typeof,这在写js的时候,是不得不知道的知识. 数据类 ...

随机推荐

  1. js设计模式-工厂模式(抽象工厂)

    场景:定义一个抽象类 AbsProducer(生产商),该生产商有两个行为,一个生产,一个出售,其中生产方法为抽象方法,由具体的厂家(工厂)去实现,出售的产品均是电子产品(返回的对象为电子产品对象,即 ...

  2. HDU 3018 一笔画问题

    题意:给你一个图 判断最少用几笔把这个图画出来(画过的边不能重新画) 思路: 并查集+欧拉回路 仔细想一想. 在一个强连通分量中 所有度为奇数的点之和÷2就是要画的笔画数 Now question : ...

  3. A - A Compatible Pair

    Problem description Nian is a monster which lives deep in the oceans. Once a year, it shows up on th ...

  4. jar运行main函数的方法

    当把java项目打包成jar后,如何运行main函数呢? 第一种:指定运行类: java -cp test.jar com.ming.test.Test 第二种:在MANIFEST.MF里配置了Mai ...

  5. CI中的验证码

    CI中的验证码相对来说使用非常方便直接加载类调用函数以及一些配置,代码如上,比较简单,具体函数可在CI手册的辅助函数参考CAPTCHA辅助函数中查询,CI中的验证码是直接生成验证码图片在你自己创建的C ...

  6. [Codeforces]Codeforces Round #460 (Div. 2)

    Supermarket 找最便宜的就行 Solution Perfect Number 暴力做 Solution Seat Arrangement 注意当k=1时,横着和竖着是同一种方案 Soluti ...

  7. 错误:Camera录制视频(6.0错误),5.1正常,7.1正常 (java.lang.RuntimeException: start failed.at android.media.MediaRecorder.native_start(Native Method))

    Process: com.example.mycamera2, PID: 24086 java.lang.RuntimeException: start failed. at android.medi ...

  8. Wireshark抓包过滤

    主要说明下抓包前准备工作,及wireshark里面的两个过滤器:捕获过滤器和应用显示过滤器 1.捕获过滤器.顾名思义就是捕获时的过滤器.主要用来决定你要抓包抓哪个IP哪个端口,明确自己要抓哪个IP和端 ...

  9. 使用Eric构建Caffe应用程序-Baby年龄识别

    训练好的Caffe网络结构,可以固定下来,直接载入程序作为数据库接口使用.本文使用Eric构建运行于Python环境下的图片识别应用程序,因为Eric使用QT作为GUI,且有Python的接口,可直接 ...

  10. MVC 入口

    1.在 Global.asax public class MvcApplication : System.Web.HttpApplication { protected void Applicatio ...