category中添加属性的简单方式
一、概念扩充:
1、如我们所知,使用category是用来对现有类进行功能扩展,或者将类分成多模块的一种方式。由声明和实现两部分组成。可以单独写成Objiective-C File类型文件(包含.h和.m)。
2、category可以用来给现有类添加新的方法。
3、category不可以给类添加成员,会直接报错(编译不过)。
4、category可以用@property来添加属性,此种方式会自动生成对应属性的set和get方法的声明,但是没有set和get方法的实现,也不会自动生成带有“_”的属性。
5、category添加的属性使用点语法无效,原因如上。
二、如何实现给category添加可以使用的属性
案例一:
1、给UIView类中添加4个属性,用来获得和更改控件frame的x,y,width,height。正常开发中,我们无法直接通过点语法来给一个控件的frame中x,y,width,height直接进行赋值操作,因为frame是CGRect类型的结构体,其中的两个成员origin和 size也是结构体类型。我们通过给UIView写一个category来实现这一操作。
(1)在category的声明中添加4个新属性:
#import <UIKit/UIKit.h> @interface UIView (EXTFrame) @property (nonatomic,assign) CGFloat x; @property (nonatomic,assign) CGFloat y; @property (nonatomic,assign) CGFloat width; @property (nonatomic,assign) CGFloat height; @end
(2)在category的实现中进行set和get方法的重写:
#import "UIView+EXTFrame.h" @implementation UIView (EXTFrame) -(void)setX:(CGFloat)x
{
CGRect rect = self.frame;
rect.origin.x=x;
self.frame = rect;
} -(CGFloat)x
{
return self.frame.origin.x;
} -(void)setY:(CGFloat)y
{
CGRect rect = self.frame;
rect.origin.y=y;
self.frame=rect;
} -(CGFloat)y
{
return self.frame.origin.y;
} -(void)setWidth:(CGFloat)width
{
CGRect rect = self.frame;
rect.size.width=width;
self.frame=rect;
} -(CGFloat)width
{
return self.frame.size.width;
} -(void)setHeight:(CGFloat)height
{
CGRect rect = self.frame;
rect.size.height=height;
self.frame=rect;
} -(CGFloat)height
{
return self.frame.size.height;
}
(3)虽然category不会生成带有“_”的属性,并不是代表set和get不可用,创建完category后,在后面开发过程中,只要包含了category头文件,同时继承于UIView的类的对象,均可以直接使用点语法获得和更改x,y,width,height,比如:MyImageView.x=50,可以非常方便的给控件的frame做改动。
案例二:
1、给UIView类添加name属性,通过关联对象(运行时机制)增加属性。
运行时实现功能:
———>运行时能够给正在运行的对象添加属性。
———>运行时能够获取正在运行的对象的所有属性。
———>运行时能够用来交换方法。
(1)在category的声明中添加name属性:
#import <UIKit/UIKit.h> @interface UIView (EXTName) @property(nonatomic,copy) NSString * name; @end
(2)在category的实现中通过运行时重写属性的set和get,要求包含objc框架里的runtime.h头文件。
#import "UIView+EXTName.h"
#import <objc/runtime.h>
@implementation UIView (EXTName)
-(void)setName:(NSString *)name
{
//self表示正在运行的对象,“NAME”是C的标识,name为添加的新属性的值,最后一个参数是属性修饰符(枚举)
objc_setAssociatedObject(self, "NAME", name, OBJC_ASSOCIATION_COPY_NONATOMIC );
} -(NSString *)name
{
return objc_getAssociatedObject(self, "NAME");
}
@end
(3)添加完此category后,UI控件可以通过点语法直接访问和设置“name”属性。
category中添加属性的简单方式的更多相关文章
- iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行
一.Runtime的理解 OC是面向对象的语言这是常识,其实就是通过Runtime机制动态创建类和对象,这里只是简单的运用runtime的使用! 二.类别(category)添加属性_使用前记得导入头 ...
- 给分类(Category)添加属性
遇到一个问题,写了一个分类,但原先类的属性不够用.添加一个属性,调用的时候崩溃了,说是找不到getter.setter方法.查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter.s ...
- discuz 修改亮剑积分商城2.91模板(在常用设置中添加商场首页排序方式的背景颜色)
在应用 -> 积分商城 -> 常用设置 中添加 商场首页排序方式 的背景颜色修改功能 步骤: 1.找到并打开此页面对应的模板source\plugin\aljsc\template\set ...
- category类别中添加属性
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...
- 在Asp.Net Core中添加区域的简单实现
使用区域,可以有效的对业务进行隔离,各种业务及分工可以更灵活.在Asp.Net Core中启用区域也是极简单的. 使用步骤: 1.在 Startup.cs 中添加区域的路由: app.UseMvc(r ...
- js 向数组对象中添加属性和属性值
let resultList = [{"name":"a1"},{"name":"b1"}] resultList.fo ...
- Bukkit编程之动态向yml文件中添加属性
yaml = new Yaml(); String goods = args[0]; String goodsNum = args[1]; YamlConfiguration yc = new Yam ...
- Android4.0.4-在build.prop中添加属性的方法【转】
本文转载自:http://blog.csdn.net/imyfriend/article/details/8939964 1.在*.rc文件中用setprop添加,例如在源码android4.0\sy ...
- color-在framwork中添加属性变量
1.今天在修改framwork中的代码的时候,需要把自己在代码中写的一个#ffffff,变成在xml中引用的变量.具体操作方法如下 1)在 frameworks/base/core/res/res/v ...
随机推荐
- CSS——精灵图与背景图片定位
精灵图产生背景: 1.网页上的每张图像都需要向服务器发送一次请求才能展现给用户.2.网页上的图像过多时,服务器就会频繁地接受和发送请求,大大降低页面的加载速度.为了有效地减少服务器接受和发送请求的次数 ...
- nested exception is java.io.FileNotFoundException: class path resource [jdbc.properties] cannot be opened because it does not exist
Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [j ...
- nc的简单使用
1.传输文件: 目的主机监听 nc -l 监听端口<未使用端口> > 要接收的文件名 nc -l 6666 > filename.tar 源主机发起请求 nc 目的主机ip ...
- GitHub代码托管平台搭建
GitHub代码托管平台搭建 注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/. 之后就可以创建仓库了(免费 ...
- 06--Qt窗口布局
Qt窗口布局 标签: qtlayout 2012-05-05 07:56 3076人阅读 评论(0) 收藏 举报 分类: Qt开发(33) 版权声明:本文为博主原创文章,未经博主允许不得转载. 布 ...
- zxing 生成条形码
private Bitmap Out1DImg() { // 1.设置条形码规格 EncodingOptions encodeOption = new EncodingOptions(); encod ...
- seam的定时轮巡
青岛的项目要做一个功能,每天凌晨2点的时候保存一次设备数据,这个就要求项目能够间隔24小时每天去做这个事,是一个自主轮巡. seam框架正好提供了这个功能,@Expiration指定开始时间,@Int ...
- mysqlconnector将EXCEL表数据导入数据库
测试excel和脚本放在同一个目录 测试excel和脚本放在同一个目录 #!/usr/bin/env python #coding=utf-8 import xlrd import mysql.con ...
- Git环境部署
部署git 服务器环境 系统环境准备 192.168.30.25 master git gitlab 192.168.30.26 client git 关闭防火墙 ...
- MATLAB学习笔记之界面基本操作
一.命令窗口 1.对于较长的命令,可以用...连接符将断开的命令连接 s=/+/+/4 ... +/+/ 注意: 连接符...与表达式之间要留一个空格: 对于单引号内的字符串必须在一行完全引起来. a ...