现在的位置: 首页 > 综合 > 正文

内存总结中

2018年07月31日 ⁄ 综合 ⁄ 共 2565字 ⁄ 字号 评论关闭

 

 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)的问题

 

  • NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载(dealloc)的时候,所有数组中的对象会被执行一次释放(retain值减一)。不仅仅是NSArray,任何收集类(Collection Classes)都执行类似操作。例如NSDictionary,甚至UINavigationController。
  • Alloc/init建立的对象,索引计数为1。无需将其再次retain。
  • [NSArray array]和[NSDate date]等“方法”建立一个索引计数为1的对象,但是也是一个自动释放对象。所以是本地临时对象,那么无所谓了。如果是打算在全Class中使用的变量(iVar),则必须retain它。
  • 缺省的类方法返回值都被执行了“自动释放”方法。(*如上中的NSArray)
  • 在类中的卸载方法“dealloc”中,release所有未被平衡的NS对象。(*所有未被autorelease,而retain值为1的)

     

  • 抱歉!评论已关闭.