源码编译:
1.预编译;为编译代码做准备,比如移除注释,重排某些指令,使其更高校.
2.编译;将源代码转变成目标文件,扩展名为.o
.
3.链接;将上一步生成的目标文件连接起来,生成可执行文件,库和框架也会被链接到可执行文件中.
几个关键字的区别 static, register, extern, const
static: 整个应用运行期间只分配一次内存
register: 它修饰的变量会被经常访问,多用于寄存器中
extern: 它修饰的变量引用了另外一个变量.
cons: 它修饰的变量是只读的,在初始化之后便不能修改.
结构体定义格式: typedef 变量定义 新类型名。
#import "ViewController.h"
typedef struct {
float x;
float y;
}YPPoint;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
YPPoint p;
p.x = 1.98;
p.y = 2.36;
}
枚举的使用
#import "ViewController.h"
enum YPEnum
{
MsgType1 = 199,
MsgType2,
};
@interface ViewController ()
@property(assign,nonatomic) enum YPEnum myEnum;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.myEnum = MsgType1;
}
指针
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
int x = 5;
int *y = &x;
NSLog(@"%p %p %p",x,&x,y);
}
打印结果:
0x5 0x7ffeeee029fc 0x7ffeeee029fc
可以看出,变量x存放的是常量5, 而变量x的内存地址是0x7ffeeee029fc,
而y是指向整形的指针,它存储的是x的地址
void myFunction(int a, int *b)
{
a = 20;
*b = 28;//反引用指针以访问原始值
NSLog(@"%d %d",a ,*b);
}
KVC的一些骚操作
NSArray *array = @[@1, @2, @3, @4, @10];
NSNumber *sum = [array valueForKeyPath:@"@sum.self"];
NSNumber *avg = [array valueForKeyPath:@"@avg.self"];
NSNumber *max = [array valueForKeyPath:@"@max.self"];
NSArray *array1 = @[@"name", @"w", @"aa", @"ZXPing"];
NSLog(@"%@", [array1 valueForKeyPath:@"uppercaseString"]);
NSArray *threeDimensionalArray = @[
@[
@[ @"Peter", @"Paul", @"Mary" ], @[ @"Joe", @"Jane" ]
],
@[
@[ @"Alice", @"Bob" ]
]
];
NSArray *flattenedArray = [threeDimensionalArray valueForKeyPath: @"@unionOfArrays.self.@unionOfArrays.self"];
为什么OC中没有多继承
B,C
类的父类都继承了A
;B,C
类中都实现了A
类的-(void)method
方法,假设D
类多继承B,C
类,当D
类调用-(void) method
方法时,就会出现二义性的问题,因为B,C
类都有可能实现了-(void) method
方法.
协议扩展
//NetWorkHelperDelegate.h
@protocol NetWorkHelperDelegate <NSObject>
@required
- (void)configHelperWithID:(NSString *)userId;
@end
//NetWorkHelperDelegate.h
@protocol NetWorkClientDelegate <NetWorkHelperDelegate>
@optional
- (void)checkNetWork;
@end
//ViewController.m 这样在只遵守 NetWorkClientDelegate 的情况下就可以实现两个代理的调用
@interface ViewController ()<NetWorkClientDelegate>
@end
@implementation ViewController
#pragma mark - NetWorkClientDelegate
- (void)configHelperWithID:(NSString *)userId
{
}
- (void)checkNetWork
{
}
关联对象
预编译指令
网友评论