再封装属性又怎么样??属性又没变。。

【转】为什么要对字段封装属性 - NetLYF - 博客园
随笔 - 85, 文章 - 0, 评论 - 27, 引用 - 0
为什么要对字段封装属性? 每次有新人来,都要问这个问题,我直接对字段操作多省事呀,就像这样:public&class&A{&&&public&&string&_N&&&&}public&Class&B{&&&private&A&_MyA;&&&public&void&DoB(string&n)&&&{&&&&&&_MyA._Name=n;&&&}}很多砖家会毫不犹豫的说,你这样“封装不好”,于是新人眨着两只无神而又水汪汪的大眼睛,分明是在说:“这不脱了裤子放X吗”,心里一肚子不服气。 但从编程角度说,封装为属性除了从外面看起来“顺眼”些,还有啥实际作用呢? 牛人会巴拉巴拉讲出一大套,我就说一点简单而实用的,那就是是从调试角度看问题。& 在调试中,我们经常为使用断点跟踪的方式,检查变量当时的数值,如果按照上面写的方式,很多地方都可能会出现对_Name赋值的情况,如果我发现_Name被设置了非法的数据,而想知道在何地被赋值的时候,上面的写法就很麻烦,只能先找到所有调用过_Name的地方(如果是C++的开发环境,找起来更麻烦),然后一个一个的筛。如果我们把代码写成这样:&&public&class&A&&{&&&&&private&string&_N&&&&&&&&&public&string&Name&&&&&{&&&&&&&get{...};&&&&&&&set{...};&&&&&}&&}&&public&Class&B&&{&&&&&private&A&_MyA;&&&&&internal&A&MyA&&&&&{&&&&&&&&get{...};&&&&&&&&set{...};&&&&&}&&&&&public&void&DoB(string&n)&&&&&{&&&&&&&&MyA.Name=n;&&&&&}&&}调试的时候,只需要在Name.set的位置加断点,可以很快定位错误。&&&&&& 当然,一个好的习惯是对class内部的字段也尽量使用属性处理,就像class B中对 MyA的处理一样。就可以很容易的进行断点调试了。还有篇文章看看:通过分类实现对倒计时按钮的封装以及如何在分类添加属性 - 简书

写了7878字,被112人关注,获得了230个喜欢
通过分类实现对倒计时按钮的封装以及如何在分类添加属性
按钮倒计时.gif
直接上代码
#import &UIKit/UIKit.h&
@interface UIButton (countDown)
倒计时按钮
@param timeLine 倒计时总时间
@param title
还没倒计时的title
@param subTitle 倒计时中的子名字,如时、分
@param mColor
还没倒计时的颜色
@param color
倒计时中的颜色
- (void)startWithTime:(NSInteger)timeLine title:(NSString *)title countDownTitle:(NSString *)subTitle mainColor:(UIColor *)mColor countColor:(UIColor *)
实现部分:
#import "UIButton+countDown.h"
@implementation UIButton (countDown)
- (void)startWithTime:(NSInteger)timeLine title:(NSString *)title
countDownTitle:(NSString *)subTitle mainColor:(UIColor *)mColor countColor:(UIColor *)color {
//倒计时时间
__block NSInteger timeOut = timeL
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
//每秒执行一次
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(_timer, ^{
//倒计时结束,关闭
if (timeOut &= 0) {
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
self.backgroundColor = mC
[self setTitle:title forState:UIControlStateNormal];
self.userInteractionEnabled = YES;
int allTime = (int)timeLine + 1;
int seconds = timeOut % allT
NSString *timeStr = [NSString stringWithFormat:@"%0.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
self.backgroundColor =
[self setTitle:[NSString stringWithFormat:@"%@%@",timeStr,subTitle] forState:UIControlStateNormal];
self.userInteractionEnabled = NO;
timeOut--;
dispatch_resume(_timer);
什么是分类:
1.分类能够做到的事情主要是:即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。同时分类能够保证你的实现类和其他的文件区分开。Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。2.值得注意的是Category理论上不能添加属性
既然说是理论上不可以添加属性,就是可以做到添加属性。这里可以使用Runtime来实现
说明在代码中:
#import &Foundation/Foundation.h&
@interface NSString (Category)
//我要添加一个实例也可以访问的变量所以就写在这里了
@property (nonatomic, strong) NSString *detailS
实现部分:
#import "NSString+Category.h"
#import &objc/runtime.h&
//用来标记是哪一个属性的key
static void *detailStrKey = &detailStrK
@implementation NSString (Category)
-(void)setDetailStr:(NSString *)detailStr
//这个方法有四个参数,分别是:源对象,关联时的用来标记是哪一个属性的key(因为你可能要添加很多属性),关联的对象和一个关联策略。
objc_setAssociatedObject(self, &detailStrKey, detailStr, OBJC_ASSOCIATION_COPY);
-(NSString *)detailStr
// 获取相关联的对象
return objc_getAssociatedObject(self, &detailStrKey);
这样就能满足当我们需要使用Class中缺少要是有的属性了,达到需求。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常?事等等,欢迎投稿《程序员》专题。
专题主编:小...
? 252689人关注
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
? 145083人关注
分享 iOS 开发的知识,解决大家遇到的问题,讨论iOS开发的前沿,欢迎大家投稿~
? 29006人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:再封装备和封装装备一样吗?什么意思呢?又怎么解锁呢?求解,谢谢
(太子少师)
(太子少师)
一样的,再封装备就是二手的,原来用过用蜜蜡封装的!
(太子少师)
装备的属性是一样的,只是有些装备有封装上限,不影响使用
(太子少师)
可输入10000个汉字
上传图片:
[经验值&50可以上传图片]
可输入50个汉字
同类未解决问题
同类已解决问题

参考资料

 

随机推荐