//
// BMViewController.m
// UITableViewTest
//
// Created by wangbaoxiang on 13-4-23.
// Copyright (c) 2013年 apple. All rights reserved.
//
#import "BMViewController.h"
@interfaceBMViewController ()
@end
@implementation BMViewController
- (void)viewDidLoad
{
[superviewDidLoad];
UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 60, 60, 480)];
table.backgroundColor = [UIColorwhiteColor];
[table.layersetAnchorPoint:CGPointMake(0.0, 0.0)];
table.transform = CGAffineTransformMakeRotation(M_PI/-2);
table.showsVerticalScrollIndicator = NO;
table.frame = CGRectMake(0, 60, 320, 60);
table.rowHeight = 60.0;
NSLog(@"%f,%f,%f,%f",table.frame.origin.x,table.frame.origin.y,table.frame.size.width,table.frame.size.height);
table.delegate = self;
table.dataSource = self;
[self.view addSubview:table];
[table release];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 16;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
cell.textLabel.textAlignment = NSTextAlignmentCenter;
cell.textLabel.backgroundColor = [UIColorredColor];
cell.textLabel.transform = CGAffineTransformMakeRotation(M_PI/2);
}
cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"--------->%d",indexPath.row);
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
自动释放池(autorelease pool)
1)、自动释放池是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。
2)、当自动释放池销毁时,池里面的所有对象都会调用一次release方法。
autorelease
1)、OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
2)、autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用release
使用autorelease
以前
Book *book = [[Book alloc] init];
[student setBook:book];
[book release];
现在:
Book *book = [ [[Book alloc] init] autorelease];
[student setBook:book];
//不要在调用[book release];
autorelease pool疑问
1)、在iphone项目中,main()中有一个默认的Autorelease Pool,程序开始时创建,程序退时销毁,按照对Autorelease的理解,岂不是Autorelease Pool里的所有对象在程序退出时才release,这样跟内存泄露有什么区别?
2)、对于每一个Runloop,系统会隐式创建一个Autorelease pool,并且把创建好的pool放在栈顶,所有的pool会构成一个栈式结构。在每一个Runloop结束时,当前栈顶的pool会被销毁,这样这个pool里的每个对象会执行release操作。
例一:
main.m
//
// main.m
// OC10-内存管理2-set方法的内存管理
//
// Created by qwz on 13-12-9.
// Copyright (c) 2013年 renhe. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[])
{
//@@autoreleasepool代表创建一个自动的释放池
@autoreleasepool {
Student *stu = [[[Student alloc] init] autorelease];
Student *stu1 = [[[Student alloc] init] autorelease];
//这个str是自动释放的,不需要释放
Student *stu2 = [Student student];
//这个str是自动释放的,不需要释放
NSString *str = [NSString stringWithFormat:@"age is %i", 10];
}
return 0;
}
Student.h
//
// Student.h
// OC10-内存管理2-set方法的内存管理
//
// Created by qwz on 13-12-9.
// Copyright (c) 2013年 renhe. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Student : NSObject
+ (id)student;
@end
Student.m
//
// Student.m
// OC10-内存管理2-set方法的内存管理
//
// Created by qwz on 13-12-9.
// Copyright (c) 2013年 renhe. All rights reserved.
//
#import "Student.h"
@implementation Student
- (void)dealloc{
NSLog(@"%@被销毁", self);
[super dealloc];
}
+ (id)student{
Student *stu = [[[Student alloc] init] autorelease];
}
@end
4 5.OC11-@class关键字
@class
通常引用一个类有两种方法:(1)一种是通过#import方式引入; (2)另一个是通过@class引入
两种方式的区别:
1、#import方式会包含被引用类的所有信息,包括被引用类的变量和方法:@class方式只是告诉编译器在A.h文件中B * b类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正查看B类信息。