一、概念扩充:

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中添加属性的简单方式的更多相关文章

  1. iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行

    一.Runtime的理解 OC是面向对象的语言这是常识,其实就是通过Runtime机制动态创建类和对象,这里只是简单的运用runtime的使用! 二.类别(category)添加属性_使用前记得导入头 ...

  2. 给分类(Category)添加属性

    遇到一个问题,写了一个分类,但原先类的属性不够用.添加一个属性,调用的时候崩溃了,说是找不到getter.setter方法.查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter.s ...

  3. discuz 修改亮剑积分商城2.91模板(在常用设置中添加商场首页排序方式的背景颜色)

    在应用 -> 积分商城 -> 常用设置 中添加 商场首页排序方式 的背景颜色修改功能 步骤: 1.找到并打开此页面对应的模板source\plugin\aljsc\template\set ...

  4. category类别中添加属性

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...

  5. 在Asp.Net Core中添加区域的简单实现

    使用区域,可以有效的对业务进行隔离,各种业务及分工可以更灵活.在Asp.Net Core中启用区域也是极简单的. 使用步骤: 1.在 Startup.cs 中添加区域的路由: app.UseMvc(r ...

  6. js 向数组对象中添加属性和属性值

    let resultList = [{"name":"a1"},{"name":"b1"}] resultList.fo ...

  7. Bukkit编程之动态向yml文件中添加属性

    yaml = new Yaml(); String goods = args[0]; String goodsNum = args[1]; YamlConfiguration yc = new Yam ...

  8. Android4.0.4-在build.prop中添加属性的方法【转】

    本文转载自:http://blog.csdn.net/imyfriend/article/details/8939964 1.在*.rc文件中用setprop添加,例如在源码android4.0\sy ...

  9. color-在framwork中添加属性变量

    1.今天在修改framwork中的代码的时候,需要把自己在代码中写的一个#ffffff,变成在xml中引用的变量.具体操作方法如下 1)在 frameworks/base/core/res/res/v ...

随机推荐

  1. C# 窗体 切换、重复显示等遗留问题解决(第五天)

    一.解决同一窗体多次点击重复显示BUG (1)点击弹出学校窗体 #region 弹出学校窗体 /// <summary> /// 弹出学校窗体 /// </summary> / ...

  2. 11、scala函数式编程

    1.将函数赋值给变量 2.匿名函数 3.高阶函数 4.高阶函数的类型推断 5.Scala的常用高级函数 6.闭包 7.SAM转换 8.Currying函数 9.return 1.将函数赋值给变量 Sc ...

  3. gtest ASSERT_TRUE和EXPECT_TRUE

    调用ASSERT_TRUE的函数,返回值类型定义必须是void,如果想返回别的类型,就用EXPECT_TRUE: void abc::fun() { ASSERT_TRUE(fun1()); } bo ...

  4. 【LeetCode】3 、Longest Substring Without Repeating Characters

    题目等级:Medium 题目描述:   Given a string, find the length of the longest substring without repeating chara ...

  5. 7-11 社交网络图中结点的“重要性”计算 (30 分)(Dijkstra算法)

    题意:  思路:对每个输入的点跑一遍dijkstra算法,然后对这个点到所有点的距离求和按公式输出就可以了. (这次尝试了用数组模拟链表来做最短路问题,刷新了自己对最短路的理解) 这里构造链表的过程我 ...

  6. uva 524(Prime Ring Problem UVA - 524 )

    dfs练习题,我素数打表的时候j=i了,一直没发现实际上是j=i*i,以后可记住了.还有最后一行不能有空格...昏迷了半天 我的代码(紫书上的算法) #include <bits/stdc++. ...

  7. 39.date hitogram基础知识

    主要知识点: date hitogram之统计每月电视销量     上一节讲到histogram,他是以数值进行分组.本节讲到以日期进行bucket分组操作,也就是说把连续的日期变成离散的日期区间,然 ...

  8. MongoDB - 增删改查及聚合操作

    目录 MongoDB - 增删改查及聚合操作 一. 数据库操作(database) 1. 创建及查看库 2. 删除库 二. 集合collectionc=操作(相当于SQL数据库中的表table) 1. ...

  9. Atcoder Code Festival 2017 qual C 10.22 D题题解

    [题意概述] 给出一个只有小写字母的序列,问最少把序列分成几段可以满足每一段可以通过变换成为回文串.变换指的是交换子序列中的字母的位置. [题解] 我们把a~z分别设为2^0~2^25,每个子序列满足 ...

  10. 6.3.3 使用 shelve 模块操作二进制文件

    Python标准库shelve也提供了二进制文件操作的功能,可以像字典赋值一样来写入二进制文件,也可以像字典一样读取二进制文件,有点类似于NoSQL数据库MongoDB. import shelve ...