iOS_关联使用(一)

关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。

在类的定义之外为类增加额外的存储空间

使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。

关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。

创建关联

创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。当然,此处的关键字和关联策略是需要进一步讨论的。
    ■  关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
    ■  关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略         是通过使用预先定义好的常量来表示的。

   关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。

   关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。


Block关联使用:


CustomView类的.h文件

#import <UIKit/UIKit.h>

typedef void (^BASE_BLOCK_NIL)();

@interface CustomView : UIView

- (id)initWithFrame:(CGRect)frame addBlock:(BASE_BLOCK_NIL)aLoadBlock;

@end


CustomView类的.m文件

#import "CustomView.h"

#import <objc/runtime.h>

static NSString *BUTTON_LOAD_BLOCK = @"load_button_block";

@implementation CustomView


- (id)initWithFrame:(CGRect)frame addBlock:(BASE_BLOCK_NIL)aLoadBlock{

    self = [super initWithFrame:frame];

    if (self) {

        self.backgroundColor = [UIColor brownColor];

        

        objc_setAssociatedObject(self, &BUTTON_LOAD_BLOCK, aLoadBlock, OBJC_ASSOCIATION_COPY);

        

        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];

        button.frame = CGRectMake(100, 100, 50, 50);

        button.backgroundColor = [UIColor purpleColor];

        [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:button];


        UIButton *buttonRemove = [UIButton buttonWithType:UIButtonTypeSystem];

        buttonRemove.frame = CGRectMake(100, 200, 50, 50);

        buttonRemove.backgroundColor = [UIColor orangeColor];

        [buttonRemove addTarget:self action:@selector(buttonRemoveAction:) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:buttonRemove];

    }

    return self;

}


- (void)buttonAction:(id)sender{

    BASE_BLOCK_NIL block = objc_getAssociatedObject(self, &BUTTON_LOAD_BLOCK);

    if (block) {

        NSString *str = @"关联_Block传值";

        block(str);

    }

}


- (void)buttonRemoveAction:(id)sender{/*取消关联*/

    objc_removeAssociatedObjects(self);

}

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect {

    // Drawing code

}

*/

@end


ViewController类的.m文件

#import "ViewController.h"

#import "CustomView.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    CustomView *aView = [[CustomView alloc] initWithFrame:self.view.bounds addBlock:^(id str){

        NSLog(@"传值^^^^^%@",str);

    }];

    [self.view addSubview:aView];

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end





### C++ `std::ios_base` 用法和功能详解 #### 基本概念 `std::ios_base` 是 C++ 中流类的基础抽象基类,定义了所有 I/O 流对象共有的属性和成员函数。这些属性控制着输入输出操作的行为方式[^1]。 #### 成员类型与常量 - **成员类型** - `fmtflags`: 表示格式化标志位的枚举组合。 - `iostate`: 描述流状态的组标志。 - `openmode`: 定义文件打开模式。 - `seekdir`: 文件指针移动方向(向前、向后等)。 - **静态公共成员变量** - `badbit`, `failbit`, `eofbit`, `goodbit`: 这些是用来检测I/O错误的状态标记。 - 对于读写权限有对应的 `app`, `binary`, `in`, `out`, `trunc`, `ate` 等选项来设置文件的操作模式[^2]. #### 关键成员函数解析 ##### 控制同步行为 为了提高程序执行速度,在不需要标准C库支持的情况下可以关闭同步机制: ```cpp // 取消同步至stdio缓冲区,默认情况下是开启的 std::ios_base::sync_with_stdio(false); ``` 另外还可以解除cin绑定到stdout的关系以进步提升性能: ```cpp // 解除cin与stdout之间的关联 std::cin.tie(nullptr); ``` 这两句代码能够显著减少不必要的刷新动作从而加快IO处理过程. ##### 设置精度及宽度 通过调整浮点数显示的小数位数以及字段宽度实现更灵活的数据展示形式: ```cpp stream.setf(std::ios::fixed | std::ios::showpoint); // 固定小数点表示并总是显示出它 stream.precision(6); // 设定默认打印六位有效数字 stream.width(8); // 输出时至少占用八个字符的空间 ``` ##### 自定义填充字符 当指定宽度不足以容纳实际数据长度时会自动补全剩余部分为空格或其他自定义符号: ```cpp stream.fill('*'); // 使用星号(*)作为填充符代替空白 ``` ##### 获取当前参数配置 有时可能需要获取当前使用的各种设定以便后续恢复原状或者记录日志用途: ```cpp auto old_flags = stream.flags(); // 复制现有格式化标志副本 auto old_precision = stream.precision(); // 查询现行精确度等级 auto old_fill_char = stream.fill(' '); // 查看原先填充字符是什么 ``` ##### 寻找位置偏移量 对于随机访问型设备而言,允许改变内部定位器的位置来进行非顺序式的存取活动: ```cpp pos_type seekoff(off_type offset, ios_base::seekdir direction, open_mode mode=ios_base::in|ios_base::out); pos_type seekpos(pos_type position, open_mode mode=ios_base::in|ios_base::out); ``` 上述两个方法分别用于基于相对距离(`seekoff`)或是绝对地址(`seekpos`)的方式重置光标所在之处.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值