NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//内的代码,包括开启的线程等,所有的都属于该内存池,自动释放的对象,都会被释放。
[pool release];
对于自动释放的对象,如
NSString* str = [NSString stringWithFormat:@"DDDDDDDDDDDDDDDDDDDddddd"];
不会立即释放,系统可能是定期检测吧,在检测期间释放自动释放对象。如果是大对象,尽量手动释放,因为系统如果没有来的及释放的话,会导致内存用完,系统崩溃的
(可以加自动释放池)
内存泄漏问题,可以用Xcode中的Build-->Build And Analyze 做初步的检查
.h
@property (nonatomic, retain) NSArray *recvDataArray;
.m
@synthesize recvDataArray;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
char buf[200];
memset(buf, 0, 200);
sprintf(buf, "服务器IP#视频接收端口#音频接收端口#图片接收端口#视频发送端口#音频发送端口#图片发送端口#消息端口#");
NSString *recvData = [NSString stringWithFormat:@"%s",buf];
NSArray *temp = [recvData componentsSeparatedByString:@"#"];
//对应将临时对象付给某个成员的时候的,如果 retainCount返回是1的话,都需要[$$ retain] 不然离开这个局部生存周期后,引用计数会自动减1,到时候就会自动释放掉了,不可以再用改内存。成员对象属性是retain即可
recvDataArray = temp;
[recvDataArray retain];//如果没有这句,下面的操作就会报错,在离开这个局部之后,引用计数减一
//sefl.recvDataArray = temp; 等价于这2句: recvDataArray = temp; [recvDataArray retain];
}
- (IBAction)testMemoryAction:(id)sender
{
int count = [recvDataArray count];
NSString *newsIp = [recvDataArray objectAtIndex:0];
}
定时器
NSTimer* sendbeatTimer// @property (nonatomic, retain)NSTimer *sendbeatTimer;
sendbeatTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(sendBeat) userInfo:nil repeats:YES];
释放的时候 [sendbeatTimer invalidate]; sendbeatTimer = nil;即可,用[sendbeatTimer release]会出错。
sendbeatTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(sendBeat) userInfo:nil repeats:NO];
如果是NO的话,只执行一次,然后sendbeatTimer自动释放了。不会导致self的retainCount加1。
类成员对象默认初始为0,指针为nil
《Objective C教程》三条规则:
(1)当你使用new、alloc或copy方法创建一个对象时,该对象的引用计数器值为1。当不再使用该对象时,你要负责向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。
(2)当你通过任何其它方法获得一个对象时,则假设该对象的引用计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留(retain)它并确保在操作完成时释放它。
(3)如果你保留(retain)了某个对象,你需要(最终)释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
NSMutableArray,NSArray,NSDate等是自动释放对象,如果其他地方需要使用,需要retain
以下来自:http://c.gzl.name/archives/98
关于索引计数(Reference Counting)的问题