经验点滴

bash

转换16进制的方法:echo ‘ibase=10;obase=16;801312852′|bc

  1. 1.把UIView 转换成图片
  2. -(UIImage *)getImageFromView:(UIView *)view{
  3. UIGraphicsBeginImageContext(view.bounds.size);
  4. [view.layer renderInContext:UIGraphicsGetCurrentContext()];
  5. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  6. UIGraphicsEndImageContext();
  7. return image;
  8. }

2. 获取指定时间与现在时间的差,转换成  天:时:分:秒

+(NSString *) compareCurrentTime:(NSString *) compareDateString

{

NSString *comStr=[compareDateString substringToIndex:compareDateString.length-2];

NSDateFormatter *df=[[NSDateFormatter alloc]init];

[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *compareDate=[df dateFromString:comStr];

NSTimeInterval  timeInterval = [compareDate timeIntervalSinceNow];

NSMutableString *result=[[NSMutableString  alloc]initWithString:@"剩余 "];

div_t h = div(timeInterval, 3600);

int hour = h.quot;

div_t m = div(h.rem, 60);

int min = m.quot;

int sec=m.rem;

if (hour>24) {

div_t d=div(hour,24);

int day=d.quot;

NSString *dayString=[NSString stringWithFormat:@"%d天",day];

[result appendString:dayString];

return  result;

}else if (hour>0&&hour<24) {

NSString *hourString=hour>=10?[NSString stringWithFormat:@"%d:",hour]:[NSString stringWithFormat:@"0%d:",hour];

[result appendString:hourString];

}else{

[result appendString:@"00:"];

}

if (min>0) {

NSString *minString=min>=10?[NSString stringWithFormat:@"%d:",min]:[NSString stringWithFormat:@"0%d:",min];

[result appendString:minString];

}else{

[result appendString:@"00:"];

}

if (sec>0) {

NSString *secString=sec>=10?[NSString stringWithFormat:@"%d",sec]:[NSString stringWithFormat:@"0%d",sec];

[result appendString:secString];

}else{

[result appendString:@"00"];

}

return  result;

}

3.设置键盘上的工具栏

UITextField *textfield=[[UITextField alloc]init];

UIView *view=[[UIView alloc]init];

textfield.inputAccessoryView=view;

4.ios模拟器中文输入:

Xcode菜单项 --> Product --> Scheme --> Edit Scheme -->  Run --> Option --> Application Region 设置为 “中国”

自动化添加注释 <#name#>

5.日历类

NSCalendar * calendar = [NSCalendar currentCalendar];

根据日期截取相应的时间段

NSDateComponents *components = [calendar components:NSCalendarUnitSecond|NSCalendarUnitMinute|NSCalendarUnitHour

fromDate:[NSDate date]];

CGFloat hour = components.hour;

CGFloat minute = components.minute;

CGFloat second = components.second;

秒的角度

CGFloat secondAngle = second * 6;

秒的弧度

CGFloat secondRadian = kRadian(secondAngle);

分钟的弧度

CGFloat minuteRadian = kRadian(minute * 6);

小时的弧度

CGFloat hourRadian = kRadian(hour * 30);

/*

每分钟,

时针增加的度数是360/12/60 = 0.5度

转动的弧度kRadian(0.5)

所以根据当前分钟数时针转动的弧度数就是 kRadian(minute * 0.5)

*/

hourRadian += kRadian(minute * 0.5);

_secondLayer.transform = CATransform3DMakeRotation(secondRadian, 0, 0, 1);

_minuteLayer.transform = CATransform3DMakeRotation(minuteRadian, 0, 0, 1);

_hourLayer.transform = CATransform3DMakeRotation(hourRadian, 0, 0, 1);

6.模拟网络请求 模态罩

UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc]

initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

UIView *coreView = [[UIView alloc]initWithFrame:self.bounds];

coreView.backgroundColor = [UIColor blackColor];

coreView.alpha = 0.0f;

[self addSubview:coreView];

[UIView animateWithDuration:0.5f  animations:^{

coreView.alpha = 0.5f;

[self.aiv startAnimating];

NSURLConnection *conn = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20.0f] delegate:self];

[conn start];

} completion:^(BOOL finished) {

[UIView animateWithDuration:0.5 delay:1 options:UIViewAnimationOptionCurveLinear animations:^{

coreView.alpha = 0.0;

} completion:^(BOOL finished) {

[self.aiv stopAnimating];

[coreView removeFromSuperview];

}];

}];

7.拉伸图片

方法一:iOS中有个叫端盖(end cap)

+ (UIImage *)resizeImage:(UIImage *)image

{

CGFloat w = image.size.width;

CGFloat h = image.size.height;

return [image stretchableImageWithLeftCapWidth:w / 2 topCapHeight:h / 2];

}

  1. // width为图片宽度
  2. rightCapWidth = width - leftCapWidth - 1;
  3. // height为图片高度
  4. bottomCapHeight = height - topCapHeight - 1

经过计算,你会发现中间的可拉伸区域只有1x1

1.这个方法在iOS 5.0出来后就过期了

2.这个方法只能拉伸1x1的区域

方法二:(ios5)

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

方法一:(ios6)

+ (UIImage *)resizableImageWithName:(NSString *)imageName

{

// 加载原有图片

UIImage *norImage = [UIImage imageNamed:imageName];

// 获取原有图片的宽高的一半()

CGFloat w = norImage.size.width * 0.5;

CGFloat h = norImage.size.height * 0.5;

// 生成可以拉伸指定位置的图片

UIImage *newImage = [norImage resizableImageWithCapInsets:UIEdgeInsetsMake(h, w, h, w) resizingMode:UIImageResizingModeStretch];

return newImage;

}

  • UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
  • UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图片

8.计算文本占用的宽高

/**

*  计算文本占用的宽高

*

*  @param str     计算的文本

*  @param font    字体

*  @param maxSize 文本最大的size

*

*  @return

*/

+ (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize

{

if (iOS_VERSION_NOT_LESS_THAN_7) {//IOS7之后

NSDictionary *dict = @{NSFontAttributeName:font};

CGSize textSize = [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin

attributes:dict context:nil].size;

return textSize;

}

CGSize textSize = [text sizeWithFont:font

constrainedToSize:CGSizeMake(maxWidth, MAXFLOAT)

lineBreakMode:NSLineBreakByCharWrapping];

return textSize;

}

9.获取应用版本号

//获取应用的版本号

NSDictionary *infoDict = [NSBundle mainBundle].infoDictionary;

//1.infoDict[(NSString *)kCFBundleVersionKey]; 2.infoDict[@"CFBundleVersion"]

NSString *currntVersion = infoDict[@"CFBundleVersion"];

10.导航栏遮盖了UITableView

1、方法一

self.edgesForExtendedLayout = UIRectEdgeNone;

压入桟的控制器frame的y值就是从导航条下面开始

self.automaticallyAdjustsScrollViewInsets = YES;

self.extendedLayoutIncludesOpaqueBars = YES;

2、方法二translucent(半透明)

self.navigationController.navigationBar.translucent = NO;

3、方法三

self.extendedLayoutIncludesOpaqueBars = NO;

4、方法四 若用到tableview

self.automaticallyAdjustsScrollViewInsets = YES;

实际内部改变了了scrollView 的 contentInsets

11.图片循环轮播

1.不复用的话就是有几个图片就建几个imageView

原理: 4-1-2-3-4-1 count = 4 +2

初始位置: scrollView.contentOffset.x = CGPointMake(LFScreenW, 0);

if (scrollView.contentOffset.x == (_photos.count + 1) * LFScreenW) {//最后一张即 ‘1’,

scrollView.contentOffset =  CGPointMake(LFScreenW, 0);//视觉上感觉不到,突然转到第一个‘1’

}

if (scrollView.contentOffset.x == 0) {//当移动到第一个4的时候

scrollView.contentOffset = CGPointMake(_photos.count * LFScreenW,0); 转到第二个‘4’

}

12.  关联 objc_setAssociatedObject(动态运行时添加实例变量或者属性)/与分类的区别就是可以添加实例变量

#import <objc/runtime.h>头文件

objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。

1 源对象alert

2 关键字 唯一静态变量key associatedkey

3 关联的对象 sender

4 关键策略

OBJC_ASSOCIATION_ASSIGN

enum {

OBJC_ASSOCIATION_ASSIGN = 0,           若引用/**< Specifies a weak reference to the associated object. */

OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object.  The association is not made atomically. */

OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied.   The association is not made atomically. */

OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.   The association is made atomically. */

OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.   The association is made atomically. */

};

objc_setAssociatedObject(alert, @"static", message,OBJC_ASSOCIATION_ASSIGN);

把alert和message字符串关联起来,作为alertview的一部分,关键词就是static,

之后可以使用objc_getAssociatedObject从alertview中获取到所关联的对象,便可以访问message

即实现了关联传值

objc_setAssociatedObject(alert, @"btn property",sender,OBJC_ASSOCIATION_ASSIGN);

}

————————————————————————————————————————————————————————————————————————————————

关联

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

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

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

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

关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。

关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。

创建关联

创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。

该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。

■  关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。

■  关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;

还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。

这种关联策略是通过使用预先定义好的常量来表示的。

1. static char overviewKey;

  1. NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];
  2. //为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁
  3. NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];
  4. objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
  5. [overview release];
  6. //(1) overview仍然是可用的
  7. [array release];
  8. //(2)overview 不可用

在(1)处,字符串overview仍然是可用的,这是因为OBJC_ASSOCIATION_RETAIN策略指明了数组要保有相关的对象。当数组array被销毁的时候,也就是在(2)处overview也就会被释放,因此而被销毁。如果此时还想使用overview,例如想通过log来输出overview的值,则会出现运行时异常。

获取相关联的对象

使用Objective-C函数objc_getAssociatedObject。

1. NSString * associatedObject = (NSString *)objc_getAssociatedObject(array, &oveviewKey);

断开关联

断开关联是使用objc_setAssociatedObject函数,传入nil值即可。

  1. objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);

其中,被关联的对象为nil,此时关联策略也就无关紧要了。

使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。

只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

14.使用initWithFormat:来确保字符串可以被销毁

15.CFObject和NSObject转换(ARC不能管理Core Foundation Object的生命周期)

__bridge只做类型转换,但是不修改对象(内存)管理权;

__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,

同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;

__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。

16.

实现自释放的方法可以总结为以下三种方式

动态属性的自释放

@property 的自释放

swizzling dealloc的自释放

17.

声明属性:strong,weak, unsafe_unretained

声明临时变量:__strong,  __weak, __unsafe_unretained,  __autoreleasing

unsafe_unretained 类似于weak 不会增加引用,但是它是不安全的,它不会在对象内存被释放的情况下将指针做为nil ,而是crash 掉,也就是所谓的野指针。

自己理解:指针的空间释放了后,都要将指针赋为NULL(nil). 在这儿用weak关键字会自动做这一步,而unsafe_unretained不会去做任何动作。(类似与变量内存监听)

__autoreleasing则可以使对像延迟释放

这样即便在函数内部申请的空间,在函数外部也可以使用,同样也适合谁分配谁释放的原则。

18 .

UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews

layoutSubviews方法调用先于drawRect

layoutIfNeeded遍历的不是superview链,应该是subviews链

iphone device的刷新频率是60hz,也就是1/60秒后重绘

19.

-ObjC 这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。

这样编译之后的app会变大(因为加载了其他的objc代码进来)。

但是如果静态库中有类和category的话只有加入这个flag才行。

-all_load 这个flag是专门处理-ObjC的一个bug.

20.

static变量是不允许添加__block标记的

Block_copy(blk);复制block后,block所持有的内存区会被拷贝至堆上

没有__block标记的变量,其值会被复制一份到block私有内存区

有__block标记的变量,其地址会被记录在block私有内存区

我们使用clang的rewrite-objc命令来获取转码后的代码。

1.对全局区的block调用copy,会返回原指针,并且这期间不处理任何东西(至少目前的内部实现是这样);

2.对栈上的block调用copy,每次会返回新复制到堆上的block的指针,同时,所有__block变量都会被复制至堆一份(多次拷贝,只会生成一份)。

3.对已经位于heap上的block,再次调用copy,只会增加block的引用计数。

objc类实例方法中的block如果被复制至heap,那么当前实例会被增加引用计数,当这个block被释放时,此实例会被减少引用计数。

但如果这个block没有使用当前实例的任何成员,那么当前实例不会被增加引用计数。

小结:

当我们创建一个block,并调用之,编译器为我们做的事情如下:

1.创建block所有的部件代码:一个主体,一个真正的执行代码函数,一个描述信息(可能包含两个辅助函数)。

2.将我们的创建代码转码为block_impl的构造语句。

3.将我们的执行语句转码为对block的执行函数的调用

我们无法直接创建堆上的block,堆上的block需要从stack block拷贝得来

栈block复制得来的新block,其isa指针会被赋值为_NSConcreteMallocBlock

在栈上创建的block,其isa指针是_NSConcreteStackBlock。

在全局区创建的block,其比较类似,其构造函数会将isa指针赋值为_NSConcreteGlobalBlock。

21 系统安全,唐巧的博客

你知道吗?中国的越狱团队还会向苹果上报漏洞,蒸米说这是为了 Reputation,一般是把手里多得觉得不太好用的漏洞报出去,你就可以想像这个封闭系统的质量了

那这个事情就无解了吗?我想很可能是的,我们能做的,就是尽量提高安全意识,尽量小心,毕竟黑客也是会考虑性价比,挑软柿子欺负。最后蒸米向我推荐了 fireeye 的攻击检测网址,上面可以看到全球正在发生的黑客攻击行为 https://www.fireeye.com/cyber-map/threat-map.html ,我想这可能就是现实吧。

开发中要做到安全性,代码混淆,加壳处理

时间: 2024-10-19 05:56:10

经验点滴的相关文章

参加香港亚洲秋季电子展经验点滴拾遗

这几天应朋友(也是上一家公司老板故对产品还是比较熟悉)之邀,至香港国际会议展览中心协助参加其公司研发之新产片展览,特将此行经历所获经验点滴记录如下,以供本人和同行参考一二 . 1. 技术不是最重要的,客户和市场导向位王,闭门造车不可取. 大部分客人过来询问的更多的是功能,价钱是否满足期望值,只有一两个是关心里面究竟是使用了什么技术.这里不是说我们产品的技术不重要,而是说在向客户介绍你的产品的时候你不应该以你的产品所用到的新技术来主导来尝试吸引用户,而更多的是顺应对方碰到的问题,去回答产品如何能很

UIAutomator中滚动ListView获得目标TextView控件对象的经验点滴

当创建一个UiScrollable对象时,如果指定的参数是new UiSelector().scrollable(true),那么会出现以下问题 当可滚动控件(比如ListView)不满一页不需要滚动时,创建的UiSrollable对象返回值是为空的. 所以以下代码是错误的: //Find out the new added note entry UiScrollable noteList = new UiScrollable( new UiSelector().scrollable(true)

编程经验点滴----使用接口表保存可能并发的业务,然后顺序处理

这篇文章的主要内容,来自与其他人的讨论. 软件系统的开发或设计时,容易遇到有并发的情况.有时候需要刻意去避免,防止数据错误.比如超市卖商品,可能两个柜台同时卖出一款矿泉水,如果软件系统后台需要跟踪每个商品的库存,此时就需要特别考虑.如果两个柜台,同时采取"读当前库存,减一,得到最新库存,保存"的设计,则可能会导致数据错误.比如,两个柜台,读当前库存,都得到 100, 减一,都得到99,作为最新数据保存,保存99.最后,尽管同时卖出了两瓶矿泉水,最后系统的库存确是99.无疑是有问题的. 一个简单的

js经验点滴js apply/call/caller/callee/bind使用方法与区别分析

一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明 call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对

网络工程师成长经验漫谈(下)

接上篇:http://blog.csdn.net/lycb_gz/article/details/55187238 故障排除是王道 在网络维护中,少不了要对各种网络故障进行排除,这是检验一个网络工程师技能水平的试刀石.有许多人有过许多工程经验,但基本上是照抄别的方案在敲命令代码,并没有真正理解为什么要那么配,更不会去想有没有更好的实现方案.这样的人遇到网络故障就两眼发黑,无从下手,究其根本原因就在于对计算机网络通信原理.各种功能技术原理,以及具体功能的通用配置思路不了解. 遇到网络故障,首先要对

写出稳定的Modbus代码之点滴经验

1.引言 Modbus是工业领域重要的协议,物理层有常见的RS485双绞线和TCP,所以又常说Modbus 485开发和Modbus TCP开发. 前者就是串口通信,比较简单.后者涉及到网络协议,复杂度高出好几个层次. 但是如果有稳定的TCP通信做铺垫,这两种Modbus的区别就不大了,都是数据包的解析而已,能共用大部分代码. 本文不讨论Modbus协议如何读写一个Register或Coil之类的,这些东西看看文档或者网上搜下博客教程就知道了. 本文目标是讨论如何写一个稳定的Modbus通信驱动

写点我的学习javaweb的点滴历程(我原来是学.net的)

今年因为项目需要,开始学习myeclipse了,虽然有几年的net学习经验,学习起来感觉,java和.net差别挺大,从创建myeclipse开发环境;安装myeclipse:安装apache:安装tomcat:用myeclipse创建第一个javaweb项目:第一个javaweb项目的发布:虽然简单,但是费了一周的业余时间.(感叹,以前初学.net时,也就是2-3天就把这些搞定了,这就是java和.net的区别之一) 下面我就把自己学习力点滴历程贡献出来(之所以贡献出来,是因为每次碰到问题到百

技术团队管理点滴

我是一个技术男,喜欢研究技术,但因职业发展的需要,做了五年的管理工作.幸好直接管理一个技术团队的一个明显的好处是:可以同时直接参与到技术工作中来,所以这几年还是做到了技术管理两不务.不过正因为我并没有花太多的心思在管理上,所以五年的管理工作所积累的也只是一些点滴的经验,而没有成体系的知识.在此,把这些年的点滴经验总结一下,算是一个里程碑吧. 管理可以这样来分:向下管理.向上管理.横向管理.因为我本人个性非常直接,从来不会P(pai)M(ma)P(pi),所以在向上管理上可以说几乎没有什么可分享的

研究生期间做项目所学到的一些经验

本文主要分享研究生期间所学到的一些科研和项目经验,实践部分偏重于硬件电路.点滴琐碎,还请见谅. 一  项目所得  1.1 心得体会 任何事物都要从最简单.最基本的构架入手,理解复杂的.--接触学习新东西时的指导思路. 做理论要做做想想,边停边走:做工程则要不断推进,因为不做不出来.工程就是靠时间堆出来的,不在于谁比谁聪明多少,而在于谁比谁用功了多少. 做工程思路:不要挑刺钻牛角尖,能用就行.要实用主义而不是理想主义,忌追求完美(比如正确解调需要信噪比至少10dB,则前端的同步就无须追求在5dB下