1.变量(存储空间)的分配与释放
1.1分配(也被称为声明或定义):将变量名与内存中的若干个字节形成私有关系
1.2释放:变量名与其私有的若干个字节不在保持私有关系
2.作用域:变量起作用的范围
2.1局部变量:定义在函数体(复合语句)内的变量
2.2全局变量:定义在函数体外的变量
2.3局部变量与全局变量同名时,全局变量不起作用
3生命周期:变量从分配存储空间(诞生)到存储空间被释放(死亡)之间的时间
3.1auto关键字(默认的):告诉编译器为局部变量
3.2static(静态)关键字
- 如果static加载方法外面 那么该全局变量只有本文件可以使用
- 如果static加载方法内 那么该全局变量只有方法可以使用
3.2.1判断该变量是否分配了存储空间
3.2.1.1如果没有空间,则给变量分配
3.2.1.2如果已经有空间,则什么都不做
3.2.2该变量所在的方法函数体结束时,static阻止释放该变量
3.2.3static延长局部变量的生命周期,到整个程序结束。但是不会改变变量的作用域局部位置
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
-(void)method1:(NSMutableString *)str;//形参是一个指针,指向一个字符串变量
-(void)method2;
-(void)method3:(NSMutableString *)str;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self method2];
}
-(void)method1:(NSMutableString *)str
{
auto int n = 1;
[str appendFormat:@"%d\n",n];//拼接字符串变量
n++;
}
-(void)method2
{
NSMutableString *str = [NSMutableString string];//将一个空字符串赋值给字符串变量str
for(int i = 0;i < 5;i++)
{
[self method3:str];
}
self.outputLabel.text = str;
}
-(void)method3:(NSMutableString *)str//实参传给形参
{
static int n = 1;
// if(变量n没有存储空间)
// {
// 给变量n分配存储空间,并初始化
// }
[str appendFormat:@"%d\n",n];//拼接字符串变量
n++;
}
@end
auto与static区别.png
auto与static的区别2.png
4进程空间
4.1进程:正在运行的可执行文件
4.2进程空间:进程所使用的所有内存(字节)
进程概念.png
4.2.1代码区:程序的源代码、常量(只读)
4.2.2全局区:全局变量、静态变量
4.2.3栈区:局部变量、形参
- 特点后进先出
4.2.4堆区:程序员向操作系统申请的变量
4.2.4.1alloc:向堆空间申请变量
4.2.4.2free:将申请的变量换回给堆空间
4.2.4.3如果不使用free否则内存泄漏。
typedef struct
{
int x;
double d;
}Data;
#define PRINT(T,x) self.outputLabel.text = [NSString stringWithFormat:@"%"#T,x];//@“%”#T表示为@“%T”,假如#T"%"表示为@“T%”
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
int a = 10;
int *p =&a;
PRINT(d, *p);
p = (int*)malloc(sizeof(int));//向堆空间申请一个整型变量
*p = 20;
PRINT(d, *p);
NSLog(@"-->%d",a);
free(p);
float *pf = (float*)malloc(sizeof(float));
*pf = 3.14;
PRINT(g, *pf);
free(pf);
double *pd = (double*)malloc(sizeof(double));
*pd = 3.148;
PRINT(f, *pd);
free(pd);
char *pch = (char*)malloc(sizeof(char));
*pch = 'a';
PRINT(c, *pch);
free(pch);
BOOL *pb = (BOOL*)malloc(sizeof(BOOL));
*pd = NO;
PRINT(d, *pb);
free(pb);
Data data1 = {10,3.14};
PRINT(d, data1.x);
Data *pData = &data1;
PRINT(d, (*pData).x);//一般编程的时候写下面那种
PRINT(d, pData->x);//->是指针操作结构体变量的成员变量时的成员运算符
pData = (Data*)malloc(sizeof(Data));
pData->x = 20;
pData->d = 3.14;
PRINT(g, pData->d);
free(pData);
}
网友评论