複習了下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 Line2 {3 struct Point start;4 struct Point end; 5 }
使用結構體
1 struct Point p;2 p.x = 20;3 p.y = 50;
適用類型定義
1 typedef struct2 {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 Person13 extern long int calculateFactorial(int value){14 return value * value;15 }16 @end17 -----------------------------------------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 }