id、构造方法、Category 分类、类的本质、description方法、SEL
?
1.id: 萬能指針id :id對象不能用點語法、id對象本身已經有 * 了 因此變量名不能有 * 。
可以吧id理解為 NSObject * 類型數據!
int main()
{
@autoreleasepool {
Person *p = [Person new];
NSObject *o = [Person new];
// 萬能指針id
id d = [Person new];
[d setAge:10];
[d setObj:@"123456"];
NSLog(@"%d",[d age]);
}
return 0;
}
?
2.構造方法:用于調用構造方法的同時初始化部分數據
//Person.m :
#import "Person.h"
@implementation Person
// 重寫init方法
- (id)init
{
if(self = [super init])
{
_age = 10;
}
return self;
}
@end
?
3.自定義構造方法:同時初始化更多數據
//Person.m
- (id)initWithName:(NSString *)name andAge:(int)age
{
if(self = [super init])
{
_name = name;
_age = age;
}
return self;
}
//Student.m
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
if(self = [super initWithName:name andAge:age])
{
_no = no;
}
return self;
}
?
4.Category-分類:在不改變原Person類的基礎上給Person類擴展一些方法,主要用于給系統類擴展方法。
?
5.分類的應用:給系統類NSString類擴展一個方法
//NSString+Number.m
#import "NSString+Number.h"
@implementation NSString (Number)
// 分類的作用:可以擴展原類的功能。
+ (int)numberCountOfString:(NSString *)str
{
return str.numberCount;
}
- (int)numberCount
{
int count = 0;
for (int i=0;i<self.length; i++) {
unichar c = [self characterAtIndex:i];
if (c >= '0' && c <= '9') {
count++;
}
}
return count;
}
@end
//main.m
#import <Foundation/Foundation.h>
#import "NSString+Number.h"
int main()
{
@autoreleasepool {
int count = [@"s8dfdfs8df78sdf6s7" numberCount];
NSLog(@"%d",count);
}
return 0;
}
?
6.類的本質:
1.當程序啟動時,就會加載項目中所有的類和分類,而且加載后會調用每個類和分類的+load方法。只會調用一次。
2.當第一次使用某個類時,就會調用當前類的+initialize方法
3.先加載父類,再加載子類(先調用父類的+load方法,再調用子類的+load方法)
先初始化父類,再初始化子類(先調用父類的+initialize方法,再調用子類的+initialize方法,最后調用的initialize方法的內容會覆蓋前面所有initialize方法!)
7.description方法:
NSLog(@"%@",c);語句執行前會:
1.會調用類的+description方法
2.拿到+description方法的返回值(NSString *)顯示到屏幕上
// 默認情況下,利用NSLog和%@輸出對象時,結果是:<類名:內存地址>
// 1.會調用對象p的-description方法
// 2.拿到-description方法的返回值(NSString *)顯示到屏幕上
// 3.-description方法默認返回的是“類名+內存地址”
// 輸出行號
NSLog(@"%d",__LINE__);
// NSLog輸出C語言字符串的時候,不能有中文
// NSLog(@"%s", __FILE__);
// 輸出源文件的名稱
printf("%s\n"__FILE__);
test9();
Person *p = [[Person alloc] init];
// 指針變量的地址
NSLog(@"%p",&p);
// 對象的地址
NSLog(@"%p",p);
// <類名:對象地址>
NSLog(@"%@",p);
?
8.SEL:
SEL其實是對方法的一種包裝,將方法包裝成一個SEL類型的數據,去找對應的方法地址。找到方法地址就可以調用方法
其實消息就是SEL
// 直接調用test2方法
Person *p = [[Person alloc] init];
[p test2];
// 1.間接調用test2方法
NSString *name = @"test2";
SEL s = NSSelectorFromString(name);//將OC字符串轉為SEL對象
[p performSelector:s];//通過SEL對象間接調用方法test2
// 2.間接調用test2方法
[p performSelector:@selector(test2)];
[p test3:@"123"];
SEL ss = @selector(test3:);//將方法名test3轉為SEL對象
[p performSelector:ss withObject:@"456"];//通過SEL對象間接調用方法test3
[p test2];
// 1.把test2包裝成SEL類型的數據
// 2.根據SEL數據找到對應的方法地址
// 3.根據方法地址調用對應的方法
?
?
?
轉載于:https://www.cnblogs.com/tzktzk1/p/3329615.html
總結
以上是生活随笔為你收集整理的id、构造方法、Category 分类、类的本质、description方法、SEL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原创:福耀科技大学值得报么?张雪峰直播间
- 下一篇: 午托变“无偿加班”?家校拉锯战下,谁该为