复习了下Objective-c的基础语法,每复习一遍,都会有新的心的,下面是总结的几点:
1、如果分配的内存没有进行有效的回收,将可能会导致内存泄露。
2、判断一个变量的内存是分配在堆内存或者是栈内存上的,主要看它是不是指针类型
3、声明局部变量时,变量的内存通常在每次进入该局部变量的作用域的时候分配并且在离开的时候释放。这类存储称之为自动存储或者通过修士关键字auto修饰
4、static关键字ixushide变量在生ing的时候分配内存,所以在程序运行期间只会分配一次内存,以后每次访问该变量的时候,实际上都是在访问原先分配的内存。
1 void someFunction(){ 2 // 无论你调用此函数多少次,person变量只会创建并初始化一次 3 static Person *person = [[Person alloc] init]; 4 }
5、全局变量默认位于全局作用域中,其行为和static变量一致,只分配一次内存,并且在整个程序运行期间保持其值不变
如果全局变量使用了static修饰,则只能在声明它的文件内部使用;如果没有static修饰,则可以在任何地方访问
6、结构体型
声明一个结构体
1 struct Point{ 2 int x; 3 int y; 4 }
生命结构体示例
1 struct Point p;
复合的结构体型
1 struct Line 2 { 3 struct Point start; 4 struct Point end; 5 }
使用结构体
1 struct Point p; 2 p.x = 20; 3 p.y = 50;
适用类型定义
1 typedef struct 2 { 3 float x; 4 float y; 5 } Point; 6 7 Point p; 8 p.x = 100.0f; 9 p.y = 200.0f;
8、使用enum
创建枚举类型
1 enum MyEnum{ 2 Value1, 3 Value2, 4 Value3 5 };
使用枚举
1 // 声明和赋值 2 enum MyEnum foo; 3 foo = Value1; 4 5 // 函数返回值 6 enum MyEnum myFuncation(); 7 8 // 作为函数参数 9 void myFunction(enum MyEnum foo); 10 11 // 类型定义 12 typedef MyEnum Foo; 13 14 // 定义时赋值 15 enum MyEnum{ 16 Value1 = 20, 17 Value2 = 100, 18 Value3 = 121 19 }
9、指针是一个包含了另一个变量的地址的变量。
指针操作符(*),取地址运算符(&)
1 int x = 5; 2 int *y = &x; 3 // 打印x的地址 4 NSLog(@"x:%ld",y); 5 // 打印x的值 6 NSLog(@"x=%ld",*y);
指针可以和常规变量进行运算,可以对新的地址的指针取值。
OC中的指针的典型使用主要是声明对象,OC中的对象实际上就是指针。
10、OC中函数的参数和返回值都是通过“传值”的方式传递的,也就是说在你传递一个参数给函数时,运行时实际上会创建一个传入值的副本。这就意味着在函数内部改变这些值将不会影响到调用函数中的值,但是如果传递了一个指针,对指针变量的任何改动都会影响到调用函数中的原变量。同时要注意不要返回指向在函数推出时超过了作用域的变量的指针或者引用。
例子:
1 #import <Foundationi/Foundation.h> 2 3 void myFunc(int a,int *b){ 4 a = 20; 5 *b = 20;// 反引用指针以访问原始值 6 } 7 8 int main(int argc,const char *argv[]){ 9 int a = 10; 10 int b = 10; 11 myFunc(a,&b); 12 13 NSLog(@"a = %d,b = %d",a,b); 14 15 return 0; 16 }
11、可以在.h中声明函数在.m中实现函数(以前都还不知道呢)
1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 5 extern long int calculateFactorial(int value); 6 7 @end 8 ----------------------------------------- 9 #import "Person.h" 10 11 12 @implementation Person 13 extern long int calculateFactorial(int value){ 14 return value * value; 15 } 16 @end 17 ----------------------------------------- 18 #import <Foundation/Foundation.h> 19 #import "Person.h" 20 21 int main(int argc, const char * argv[]) 22 { 23 24 @autoreleasepool { 25 printf("========== here ---------------%ld",calculateFactorial(100)); 26 } 27 return 0; 28 }
12、import语句中的<>和""的区别是:如果是系统的或者第三方的就使用<>,是自己创建的就使用""
13、在OC中switch-case中case子句的控制变量只能是整数
14、OC支持两种类型的for循环:
1 for (<#initialization#>; <#condition#>; <#increment#>) { 2 <#statements#> 3 } 4 5 for (<#type *object#> in <#collection#>) { 6 <#statements#> 7 }