<<好学的Objective-C>>

基础类型数据表

源码编译:

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 *)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: @"@[email protected]"];

为什么OC中没有多继承
B,C 类的父类都继承了A;B,C类中都实现了A类的-(void)method方法,假设D类多继承B,C类,当D类调用-(void) method方法时,就会出现二义性的问题,因为B,C类都有可能实现了-(void) method方法.

多继承导致的二义性问题

协议扩展

//NetWorkHelperDelegate.h
@protocol NetWorkHelperDelegate 
@required
- (void)configHelperWithID:(NSString *)userId;
@end

//NetWorkHelperDelegate.h
@protocol NetWorkClientDelegate 
@optional
- (void)checkNetWork;
@end

//ViewController.m  这样在只遵守 NetWorkClientDelegate 的情况下就可以实现两个代理的调用
@interface ViewController ()
@end

@implementation ViewController
#pragma mark - NetWorkClientDelegate
- (void)configHelperWithID:(NSString *)userId
{ 
}
- (void)checkNetWork
{
}

关联对象

关联策略说明

预编译指令

image.png

你可能感兴趣的:(<<好学的Objective-C>>)