日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言万能预编译,Objective-C学习笔记

發布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。