版权说明:讲解语言细节,揉杂了各种经典书籍的代码,正确性是额可肯定的,不喜勿喷。代码全部在Xcode4.4亲手编译。
备注:看此文者请具备C/C++ 学习背景,相信大学都教了吧,最好具有编程经验。本人易拾人牙慧,希望能给诸位些许帮助。
OC即object c一下均用OC表达。
[IOS/C/C++程序员必须学会内存管理,创建对象和销毁对象,必须成对出现。]
[内存管理不善,造成内存泄漏,会粗大事,骚年们]
1.对象的创建
在C/C++ 中,我们通过new等关键字开辟内存控件,并且进行初始化。(有经验的C++程序员不会使用new关键字创建对象,请看下文)。
我们以前在C++中通过new关键字创建对象的时候,其实同时完成了初始化。很多时候,我们并不希望得到这个结果,于是熟练的程序员会使用其他的方法。
关于C++ 的知识请看 《C++ 程序设计语言》或者《C++ PRIMER》都有很详细的语法说明,关于C++的知识我就不再赘述了。
1 NSString *str=[[NSString alloc]initWithFormat:@"hello"];
完整代码:
1 int main(int argc, const char * argv[]) 2 { 3 4 NSString *str=[[NSString alloc]initWithFormat:@"hello"]; 5 NSLog(@"str = %@",str); 6 return 0; 7 }
输出结果:
2012-08-05 15:02:16.960 testDemo[1698:303] str = hello
小提示:
alloc关键字负责开辟内存空间,initWithForamt格式化了一个字符串对str进行了初始化。init初始化具有很多重载方法,就不一一细表了。
NSLog类似于printf,输出的时候带有时间戳,在代码调试中,经常会用到,相信大家也知道OC支持C/C++混编。不用printf 的原因是因为NSLog在OC中效率最高。
OC中使用计数器进行内存管理,采用new alloc 等关键字创建对象,retainCount会加1,对象被引用一次计数器也会加1,retain保持对象,也会是计数器+1.
使用relese关键字会释放一次对象,计数器减1.当计数器为0的时候,对象销毁。
现在我们看以下代码关注计数器的变化。
1 // 2 // Car.m 3 // testDemo 4 // 5 // Created by YuZai on 12-8-5. 6 // Copyright (c) 2012年 YuZai. All rights reserved. 7 // 8 9 #import "Car.h" 10 11 @implementation Car 12 -(id)init 13 { 14 if (self=[super init]) { 15 16 } 17 return self; 18 } 19 -(void)dealloc 20 { 21 NSLog(@"Car object is dealloc!"); 22 [super dealloc]; 23 } 24 @end
1 // 2 // main.m 3 // testDemo 4 // 5 // Created by YuZai on 12-8-5. 6 // Copyright (c) 2012年 YuZai. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 #import "Car.h" 11 12 int main(int argc, const char * argv[]) 13 { 14 15 Car *car=[[Car alloc]init]; 16 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 17 //保持对象 18 [car retain]; 19 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 20 [car release]; 21 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 22 [car release]; 23 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 24 25 26 return 0; 27 }
输出结果:
2012-08-05 15:32:37.815 testDemo[1960:303] car retainCount is 1
2012-08-05 15:32:37.817 testDemo[1960:303] car retainCount is 2
2012-08-05 15:32:37.817 testDemo[1960:303] car retainCount is 1
2012-08-05 15:32:37.818 testDemo[1960:303] Car object is dealloc!
2012-08-05 15:32:37.818 testDemo[1960:303] car retainCount is 1
1 //此方法属于对象 2 -(Car *)car 3 { 4 return [[[Car alloc]init]autorelease]; 5 } 6 //此方法属于类 7 +(Car *)car 8 { 9 return [[[Car alloc]init]autorelease]; 10 }
1 // 2 // main.m 3 // testDemo 4 // 5 // Created by YuZai on 12-8-5. 6 // Copyright (c) 2012年 YuZai. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 #import "Car.h" 11 12 int main(int argc, const char * argv[]) 13 { 14 /** 15 Car *car=[[Car alloc]init]; 16 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 17 //保持对象 18 [car retain]; 19 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 20 [car release]; 21 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 22 [car release]; 23 NSLog(@"car retainCount is %lx",(unsigned long)[car retainCount]); 24 **/ 25 for (int i=0; i!=10; i++) { 26 NSLog(@"when i is %d,car retainCount is %lx",i,(unsigned long)[[Car car]retainCount]); 27 } 28 29 return 0; 30 }
输出结果:
2012-08-05 15:55:45.349 testDemo[2143:303] when i is 0,car retainCount is 1
2012-08-05 15:55:45.351 testDemo[2143:303] when i is 1,car retainCount is 1
2012-08-05 15:55:45.351 testDemo[2143:303] when i is 2,car retainCount is 1
2012-08-05 15:55:45.352 testDemo[2143:303] when i is 3,car retainCount is 1
2012-08-05 15:55:45.352 testDemo[2143:303] when i is 4,car retainCount is 1
2012-08-05 15:55:45.353 testDemo[2143:303] when i is 5,car retainCount is 1
2012-08-05 15:55:45.353 testDemo[2143:303] when i is 6,car retainCount is 1
2012-08-05 15:55:45.354 testDemo[2143:303] when i is 7,car retainCount is 1
2012-08-05 15:55:45.354 testDemo[2143:303] when i is 8,car retainCount is 1
2012-08-05 15:55:45.355 testDemo[2143:303] when i is 9,car retainCount is 1
代码: