c语言万能预编译,Objective-C学习笔记
import 指令(將文件的內容在預編譯的時候拷貝到寫指令的地方)
import
Foundation 框架
NSLog 函數 NSLog(@"Hello, World!");
NSString語法: NSString *str = @"jack";
字符串占位符: %@
數據類型
C 語言支持的數據類型
基本數據類型int double float char
構造類型數組 結構體 枚舉
指針類型int *p1
空類型void
typedef 自定義類型
BOOl 類型 YES/NO
Boolean 類型 true/false
class 類
id 類型 萬能指針
nil 與 NULL 差不多
SEL 方法選擇器
block 代碼段
類
類的定義語法
聲明:
@inteface 類名 : NSObject
{
}
@inteface Person : NSObject
{
NSString *_name;
int _age;
float _height;
}
- (void)run;
- (void)run : (參數類型)形參名稱;
- (void)run : (參數類型1)形參名稱1 : (參數類型2)形參名稱2;
- (void)eat : (NSString *)foodName;
- (void)sum : (int)num1 : (int)num2;
@end
實現:
@implementation 類名
@end
實現:
@implementation Person
- (void)run
{
NSLog(@"這是一個方法");
}
- (void)eat: (NSString *)foodName
{
NSLog(@"這是一個方法的參數%@", foodName);
}
- (int)sum : (int)num1 : (int)num2 {
int sum = num1 + num2;
NSLog(@"num1和num2的和是%d", sum);
return sum;
}
@end
實例化Person *p1 = [Person new];
調用實例方法[p1 run];
[p1 eat : @"紅燒排骨"];
[p1 eat: 1: 2];
方法中訪問屬性
NULL和nil的區別
NULL一般用于指針不指向內存內存中的任何一塊空間
nil一般用于類指針不指向任何對象
類的封裝
setter
getter
對象和對象之間的關系(組合/依賴/關聯/繼承)
static關鍵字
C語言中的static關鍵字a.修飾局部變量
b.修飾全局變量
c.修飾函數
OC中的static關鍵字a. static不能修飾屬性, 也不能修飾方法
b. static可以修飾方法中的局部變量
如果方法的返回值是當前類的對象, 那么這個方法的返回值寫instancetype
self關鍵字
獲取類在代碼段中的地址的方式a. 調試查看對象的isa指針的值
b. 在類方法中查看self的值
c. 調用對象的對象方法class, 就會返回這個對象所屬的類在代碼中的地址 [person1 class]
d. 調用類的class方法 [Person class]
類的繼承語法(繼承所有屬性和方法, 包括靜態方法和靜態屬性和類方法):
@inteface Chinese : Person {
}
@end
@implementation Chinese {
}
@end
super關鍵字
訪問修飾符(默認是protected)@private(只能在對象方法中訪問, 子類對象方法無法訪問, 無法通過對象訪問)
示例
@inteface Chinese : NSObject {
@private
NSString *_name = "Felix";
}
@end
@implementation Chinese {
}
@end
@protected(只能在本類和子類的對象方法中訪問, 無法通過對象訪問)
@package(只能在當前框架中訪問, 了解)
@publick(可以在任何地方訪問)
修飾符只能修飾屬性, 不能修飾方法;
私有屬性將屬性寫在implementation中
私有方法只寫實現, 不寫聲明
子類方式的重寫子類在實現的時候重寫即可
description方法(每個類都有一個=description方法, 該方法打印的是對象的地址, 可以重寫它來適應自己的需求)
sel對象
點語法(就是調用調用對象的setter或者getter方法)
@property自動生成setter、getter方法的聲明(定義還是要自己寫);
@inteface Person : NSObject {
NSString *_name;
int _age;
}
- (void) setName: (NSString *) name;
- (NSString *) name;
@property int age;
// 生成age的setter和getter的聲明
// 也就是 - (void) setName: (NSString *) name;
// - (NSString *) name;
@end
@synthesize自動生成getter/setter方法的實現
語法
@synthesize @property名稱;
示例:
@inteface Person : NSObject {
NSString *_name;
int _age;
}
@property int age;
@end
@implementation Person
@synthesize
@end
@property 增強@inteface Person : NSObject
@property NSString *name;
@end
1) 生成一個私有屬性, 類型為NSString, 屬性名為_name
2) 生成getter/setter聲明
3) 生成getter/setter實現
靜態類型和動態類型靜態類型: 一個指針指向的對象是一個本類對象;
動態類型: 一個指針指向的對象不是一個本類對象;
id指針 --> 萬能指針類型, 可以指向任意OC對象id id1 = [Person new];
instancetype 代表方法的返回值是當前這個類的對象語法
+ (instancetype)person {
return [self person];
}
動態類型檢測
intanceResonseToSelector 判斷一個類中是否有某個方法
resonseToSelector 判斷一個對象中是否有某個方法Person *p1 = [Person new];
BOOL res = [p1 resonseToSelector:@selector(sayHi)];
isKindOfClass方法(對象方法) 判斷指定對象是否為指定類的對象或者子類對象[s1 isKindOfClass: [Person class]]
isMemberOfClass方法(對象方法) 判斷指定對象是否為指定類的對象, 不包括子類[s1 isMemberOfClass: [Person class]]
isSubClassOfClass方法(類范發給) 判斷指定對象是否為指定類的子類的對象
構造方法
重寫init方法的規范
1) 必須要先調用父類的init方法, 然后將方法的返回值賦值給slef
2) 調用init方法初始化對象有可能失敗, 如果初始化失敗, 返回的就是nil
3) 判斷父類是否初始化成功, 如果初始化成功, 就初始化當前對象的屬性
4) 最后, 返回self的值@implementation Person
- (instancetype)init {
self = [super init];
if (self != nil) {
}
return slef;
}
@end
帶參數的init方法
1) init規范
2) 必須以initWith開頭
3) 返回值必須是instancetype聲明
@inteface Person
- (instancetype)initWithName:(NSString *)name andAge:(int)age;
@end
實現
@implementation Person
- (instancetype)initWithName:(NSString *)name andAge:(int)age {
self = [super init];
if (self != nil) {
self.name = name;
self.age = age;
}
return slef;
}
@end
調用
Person *felix = [[Person alloc] initWithName: @"小花" andAge : 18]
內存管理棧區: 局部變量, 當局部變量的作用域被執行完畢之后, 這個局部變量就會被系統立即回收
堆區:OC對象, C函數申請的動態空間
BSS段: 未初始化的全局變量, 靜態變量, 一旦初始化以后就會被回收, 并轉存到數據段之中
數據段: 已經初始化的全局變量, 靜態變量, 直到程序結束的時候才會被回收
代碼段: 代碼, 程序結束的時候系統會被自動回收存儲在代碼段中的數據
引用計數器1) 每一個對象都有一個屬性: retainCount, 叫做引用計數器, 類型是unsigned long, 占據8個字節;
引用計數器的作用, 用來記錄當前這個對象有多少個人在用
內存管理的分類MRC: Manual Reference Counting 手動引用計數, 手動沒存管理
ARC: Automatic Reference Counting 自動引用計數, 自動內存管理
重寫dealloc的規范必要要調用父類的dealloc方法, 并且調用父類dealloc的方法必須放在dealloc方法的最后;
@property參數@property的四組參數(參數順序可以隨意, 但是一般按照如下順序寫)
a. 與多線程相關的兩個參數
atomic(多線程安全鎖: 安全、效率低下)
nonatomic(不加多線程安全鎖: 不安全、效率高)
b. 與生成的setter方法的實現相關的參數
assign: 默認值, 生成的setter方法直接賦值
retain: 生成的setter方法就是標準的MRC的內存管理, 也就是先判斷是否為同一個對象, 如果是release舊的, retain新的
當屬性類型是OC對象類型的時候, 那么就用retain, 否則用assign
注意: 要手動寫重寫dealloc方法
c. 與生成只讀、讀寫相關的參數
readonly: 只讀, 只會生成getter, 不會生成setter
readwrite: 默認值, 同時生成getter和setter
d. 與生成的getter setter方法名字相關的參數
getter、setter
@property(nonatomic, assign, getter = methodName) age;
@property(nonatomic, assign, setter = methodName:) age;
e. stong、weak 代表指針類型為強類型還是弱類型(默認是強類型)
# 自動釋放池創建自動釋放池
@autoreleasepool
{
Person *p1 = [[[Person alloc] init] autorelease];
}
分類注意事項:
1) 分類中只能寫方法, 不能寫屬性;
2) 在分類中使用@property, 只會自動生成聲明, 不能自動生成實現, 也不會自動生成私有屬性;
3) 在分類中不能直接訪問真私有屬性(定義在implementation之中), 但是可以通過getter和setter訪問
4) 當分類中有和本類同名的方法的時候, 優先調用分類的方法, 哪怕沒有引入分類頭文件, 如果多個分類中有相同的方法, 優先調用最后編譯的分類的;
延展1) 延展是一個特殊的分類
2) 延展這個分類沒有名字
3) 只有聲明, 沒有實現, 和本類共享一個實現
4) 分類中只能新增方法, 延展中任意成員都可以寫
5) 分類中寫@property, 只會生成getter setter的聲明
延展中寫@property, 會自動生成私有屬性, 也會自動生成getter和setter的聲明和實現
語法:
@inteface 本類名 ()
- (void)run;
- (void)sleep;
@end
沒有實現, 在本類中實現
應用:
為類生成一個私有的@property
延展一般情況下不會獨占一個文件, 都是將延展直接寫在本類的實現文件中?
OC在C的基礎之上新增了一些數據類型BOOL
Boolean
class
nil
SEL
id(萬能指針)
block
block變量聲明:
必須要指定block變量存儲的代碼是否有參數, 是否有返回值
示例:
返回值類型 (^block變量的名稱)(參數列表);
void (^myBlock1)(); 表示聲明了一個block類型的變量叫做myBlock1 這個變量只能儲存沒有返回值沒有參數的代碼段
int (^myBlock2)(int num1, int num2);
初始化:
代碼段的書寫格式:
^返回值列表(參數列表) {
代碼段;
}
^void () {
NSLog(@"its a");
NSLog(@"its b");
}
myBlock1 = ^void () {
NSLog(@"its a");
NSLog(@"its b");
}
執行:
myBlock1();
使用typedef將復雜的block定義簡化typedef void (^NewType)();
NewType block1;
NewType block2;
typedef int (^NewType)(int num1, int num2);
block訪問外部變量1)在block代碼塊的內部可以取定義在外部的變量的值, 定義在外部的局部變量和外部變量
2) 在block代碼塊的內部可以修改全局變量的值, 但是不能修改定義在外部的局部變量的值
3) 如果想要修改定義在block外部的局部變量的值, 需要在局部變量前面加上__block修飾符, 例如__block int num = 300;
protocol協議(聲明一大堆方法, 然后類去遵守)語法: @inteface Person : NSObject
@required(默認值)、@optional(不實現, 都不會報錯, required會報警告??, 但是@optional不會)
協議之間的繼承語法:
@protocol 協議名稱
@end
限制協議1) NSObject *指針名 = [Student new];
id id = [Student new];
如果Student隊形沒有遵守StudentProtocol協議就會報警告
2) 聲明一個指針變量, 要求這個指針指向的對象必須遵守多個協議
NSObject *stu;
3) 聲明一個指定類型的遵守了協議的學生對象
Student *stu;
Foundation框架
字符串常用方法a. stringWithFormat 字符串拼接
[NSString stringWithFormat: "@大家好, 我叫%@, 我今年%d歲", str, age]
b. lenth 方法, 字符串長度
NSUInteger len = str.length;
c. characterAtIndex
Unichar ch = [str characterAtIndex: 2];
d. isEqualToString 判斷兩個字符是否相同
e. rangeOfString 搜索某個字符第一次出現的下標(indexOf)
NSRange range = [str rangeOfString];
NSRange是一個NSRange類型的結構體變量
typedef struct _NSRange {
NSUInteger location; 代表子串字主串出現的下標(沒有就是unsigned long的最大值)
NSUInteger length; 代表子串創在主創中匹配的長度(沒有就是0)
} NSRange;
f. subStringFromIndex 字符創截取
[str subStringFromIndex: 3]; // 從第三個開始截取, 截取到最后
[str subStringToIndex: 3]; // 從第0個開始截取, 截取指定個數
[str subStringWithRange: NSMakeRange(2, 3)]; // 從指定位置開始截取, 截取指定個數
g. stringByReplacingOccurrencesOfString 字符串的替換(相當于replace方法)
NSString *email = @"wasd#qq.com"; // 替換“#”號
email = [email stringByReplacingOccurrencesOfString: @"#", @"@"];
h. NSString *str = @"1" 字符串轉其他類型
int num = str.intValue;
int num = str.intValue;
NSInteger num = str.integerValue;
double num = str.doubleValue;
float num = str.floatValue;
long long num = str.longLongValue;
bool num = str.boolValue;
i. stringByTrimmingCharactersInSet 去掉字符串前后空格
[str stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
j. uppercaseString 字符串轉大寫
[str uppercaseString];
k. lowercaseString 字符串轉小寫
[str lowercaseString];
創建NSRange變量的方法1. NSRange range;
range.location = 3;
range.length = 4;
2. NSRange range = { 3, 7 };
3. NSRange range = { .location = 3, .length = 7 };
4. NSRange range = NSMakeRange(3, 7);
NSMutableStringNSMutableString *str = [NSMutableString string];
[str appendString:@"jack"];
[str appendString:@"rose"]; // 追加
[str appendFormat:@"我今年%ds歲了", age]; // 以拼接的方式追加
NSArray特點:
a. 只能存儲OC對象, 任意的OC對象
b. 長度固定, 一旦NSArray數組創建完畢之后, 元素的長度固定, 無法新增, 也無法刪除
c. 每個元素都是緊密相連的, 每一個元素仍然有自己的下標
d. 元素的類型是id類型(萬能指針)
創建方式:
NSArray *arr = [NSArray arrayWithObejcts: @"rose", @"jack", @"lilei", @"hanmeimei", nil];
簡寫方式:
NSArray *arr = @[@"rose", @"jack", @"lilei", @"hanmeimei", ]
NSArray常用屬性和方法;NSArray *arr = @[@"jack", @"rose", @"lilei"];
1. 獲取數組長度:
NSInteger count = arr.count;
2. 獲取指定下標的元素
[arr objectAtIndex: 3];
3. 判斷是否包含指定的元素
[arr containsObject: @"lili"];
4. 獲取首個, 結尾的元素
arr.firstObject;
arr.lastObject;
5. 查找元素在數組中第一次出現的下標(沒有找到就返回NSUInteger的最大值)
NSUInteger index = [arr indexOfObject: @"rose"];
for-in 循環遍歷元素語法for(NSString *str in arr) {
NSLog(@"%@", str);
}
使用block遍歷 enumerateObjectsUsingBlock
數組轉NSString(js的join方法)NSArray *arr = @[@"jack", @"rose", @"jim"];
NSString *str = [arr componentsJoinedByString: @"-"];
NSString轉數組NSString = @"柳州市, 城中區, 地王財富中心";
NSArray *arr = [str componentsSeparatedByString: @","];
NSMutableArray(支持動態新增刪除功能)創建:
1. NSMutableArray *arr4 = [NSMutableArray new];
2. NSMutableArray *arr4 = [[NSMutableArray alloc] init];
3. NSMutableArray *arr4 = [NSMutableArray array];
4.NSMutableArray *arr4 = [NSmutableArray arrayWithObjects: @"jack", @"rose", @"lili", nul];
1.新增元素:
NSMutableArray *arr4 = [NSMutableArray new];
[arr4 addObject: @"jack"];
2.新增數組:
NSObject arr = @[@“jack”, @"rose", @"lucy", @"tom"];
NSMutableArray *arr = [NSMutableArray new];
[arr addObjectFromArray: arr];
3.指定下標處插入元素;
NSMutableArray *arr = [NSmutableArray arrayWithObjects: @"jack", @"rose", @"lili", nul];
[arr insertObject: @"lilei" atIndex: 1];
4.刪除指定下標的元素:
[arr removeObjectAtIndex: 1];
5.刪除所有指定的元素:
[arr removeObject: @"lili"];
6.刪除最后一個元素:
[arr removeLastObject];
7.刪除所有元素:
[arr removeAllObjects];
NSNumberNSNumber *number1 = [NSNumber numberWithInt: 10];
NSNumber *number2 = [NSNumber numberWithInt: 20];
NSNumber *number3 = [NSNumber numberWithInt: 30];
NSNumber *number4 = [NSNumber numberWithInt: 40];
NSArray *arr = @[number1, number2, number3, number4]
遍歷:
for (NSNumber *num in arr) {
NSLog(@"%D", num.intValue);
}
簡寫:
NSNumber *number1 = @10;
int num = 10;
NSNumber *n1 = @(num);
NSDictionary創建方式:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndkeys:@"jack", @"name", @"18", @"age", nil];
簡寫:
NSDictionary *dict = @{@"name": @"rose", @"age": @"18"};
打印:
NSLog(@"%@", dict);
取值:
dict[name];
dict.count;
[dict obejctForKeys: @"age"];
遍歷:
for (id key in dict) {
NSLog(@"%@ = %@", key, dict[key]);
}
使用block遍歷 enumerateKeysAndObjectsUsingBlock
NSMutableDictionary新增key:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndkeys: @"jack", @"name", @"18",@"age", nil];
[dict setObject:@"廣州市xx街道", forKey: @"address"];
刪除所有的鍵值對removeAllObjects
刪除指定的鍵值對removeObjectForKey
[dict removeObjectForKey: @"age"];
NSFileManager創建
NSFileManager *manager = [NSFileManager defaultManage];
1. fileExistsAtPath 判斷指定路徑下的文件是否存在
NSString *path = @"/Users/Apple/deastop/cc.mp3";
BOOL res = [manager fileExistsAtPath: path]
暫停程序sleep[NSThread sleepForTimeInterval: 10];
CGPoint聲明:
1. CGPoint p1;
p1.x = 20;
p1.y = 30;
2. CGPoint p1 = {20, 30};
3. CGPoint p1 = {.x = 20, .y = 30};
4. CGPiont p1 = CGPointMaker(20, 30);
CGSize聲明:
1. CGSize size;
size.x = 20;
size.y = 30;
2. CGSize size = {20, 30};
3. CGSize size = {.x = 20, .y = 30};
4. CGPiont size = CGSizeMaker(20, 30);
CGRectCGRect rect;
rect.origin.x = 20;
rect.origin.y = 30;
rect.size.width = 100;
rect.size.height = 200;
NSValue用來包裝結構體, 類似于NSNumber;
字符串和時間相互轉換1. 獲取當前系統時間
NSDate *date = [NSDate new];
NSLog(@"%@", date);
2. 時間轉字符串
NSDateForMatter *formatter = [NSDateFormatter new];
formatter.dateFormatter = @"yyyy-MM-DD HH:mm:ss";
NSString *str = [formatter stringFromDate: date];
3. 字符串轉NSDate對象
NSString *strDate = @“2021年12月12號 12點12分12秒”;
NSDateForMatter *formatter = [NSDateFormatter new];
formatter.dateFormatter = @"yyyy年MM月DD號 HH點mm分ss秒";
NSDate *date = [formatter dateFromString: strDate];
時間計算
NSCalendar獲取時間對象的各個部分
單例模式
總結
以上是生活随笔為你收集整理的c语言万能预编译,Objective-C学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux创建数据库实例(linux 创
- 下一篇: DDOS攻击目的(ddos 攻击目的)