关闭用户交互
self.view.userInteractionEnabled = NO;
//该设置会默认关闭编辑状态,相当于在禁用用户交互的同时附加了以下语句。
[self.view endEditing:YES];
模态跳转,控制器背景透明效果。
UIViewController *controller = [[UIViewController alloc] init];
//Case One:
//首先要设置模态跳转的目标控制器
[nav setModalPresentationStyle:UIModalPresentationOverCurrentContext];
//然后设置根控制器
rootController.modalPresentationStyle = UIModalPresentationCurrentContext;
[rootController presentViewController:controller animated:YES completion:nil];
//Case Two:
//如果需要导航控制器包装
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:controller];
//这里设置顶层控制器
[nav setModalPresentationStyle:UIModalPresentationOverCurrentContext];
//然后设置根控制器
rootController.modalPresentationStyle = UIModalPresentationCurrentContext;
[rootController presentViewController:nav animated:YES completion:nil];
SVN 报以下错误 【引用来源】
Description : The pristine text with checksum '87a646007bab45d5f943a1bf9e76ee9109a6bdd9' was not found
Suggestion : The operation could not be completed.
Technical Information
=====================
Error : V4Error
Exception : ZSVNException
Causal Information
==================
Description : The pristine text with checksum '87a646007bab45d5f943a1bf9e76ee9109a6bdd9' was not found
Status : 155032
解决办法:
1. 首先确定 .svn 文件夹位置,在你本地的WorkFlow 工作目录的根目录下。
2. 根据上面的提示信息,确定出错文件的sha1 值 87a646007bab45d5f943a1bf9e76ee9109a6bdd9
3. 切换到WorkFlow目录下,执行以下命令
sqlite3 .svn/wc.db
#(例子中为87a646007bab45d5f943a1bf9e76ee9109a6bdd9),注意前面的$sha1$要保留
sqlite> select * from pristine where checksum="$sha1$87a646007bab45d5f943a1bf9e76ee9109a6bdd9";
#执行上面的命令后查询结果为空,那么继续下面的操作
sqlite> select * from nodes where checksum="$sha1$87a646007bab45d5f943a1bf9e76ee9109a6bdd9";
#找到一条记录,那么直接删除,命令如下
sqlite> delete from nodes where checksum="$sha1$87a646007bab45d5f943a1bf9e76ee9109a6bdd9";
最后 svn 执行update 操作,基本就OK了。
@synchronized
//线程同步代码块
@synchronized(obj){
// 线程独占代码
}
运行时系统执行上诉代码时,实际上是通过创建 mutex 锁实现的。
参数 obj 通常指定为该互斥锁要保护的对象,obj 自己不需要是锁对象。
线程如果要执行该代码块,首先会尝试获得锁,如果能获得锁则可以执行块内代码。块执行结束,会同时释放锁。
使用break 或 return 从块内跳出到块外时也被视为块执行终止,并且在快内发生异常时,运行时系统会捕捉异常并释放块。
eg:
static id g = ...;
- (void)doSomething:(id)arg {
static id loc = ...;
@synchronized(g) {...} // a
@synchronized(loc) {...} // b
@synchronized(self) {...} // c
@synchronized(arg) {...} // d
@synchronized([self localLock]) {...} // e
}
a. 是指定只能单独存在的对象时的情景。同一个对象在其他地方也作为@synchronized 的参数使用时,所有这些块不能同时执行。
b. 也一样,因为限制了参数的使用范围,互斥对象显然只能是该方法内的块。
c. 是各个实例互斥的例子,一个实例一次只能执行一个线程,同一类别的其他实例则多个线程可以同时存在。
d. 在参数对象可能在多个地方更改的情况下有效,但以同样方式使用该对象的所有场所中都需要按照该方式书写,否则就没有任何意义。
e. 也可以指定类对象、或者消息选择器(隐藏参数的 _cmd )来指定方法,不过一般情况下,为互斥的对象使用专门的锁对象是比较可靠的方法。
*** 同递归锁 NSRecursiveLock 一样,可以递归调用而不会引起死锁。***
@synchronized(obj) {
@synchronized(obj){
}
}
UITextView 计算文本行数
NSString *text = textView.text;
UIFont *font = [UIFont fontWithName:DP_FONTNAME size:yourFontSize];
CGRect rect = [text boundingRectWithSize:CGSizeMake(preLayoutWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil];
NSInteger lines = (NSInteger)(roundf(rect.size.height / font.lineHeight));
系统存储空间访问 @骑着JM的hi
//留作备忘
//问题解决方向:需要通过mach层接口访问
vm_statistics64_data_t vmstat;
natural_t size = HOST_VM_INFO64_COUNT;
if (host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info64_t)&vmstat, &size) == KERN_SUCCESS) {
return (LXDSystemMemoryUsage){
.free = vmstat.free_count * PAGE_SIZE / NBYTE_PER_MB,
.wired = vmstat.wire_count * PAGE_SIZE / NBYTE_PER_MB,
.active = vmstat.active_count * PAGE_SIZE / NBYTE_PER_MB,
.inactive = vmstat.inactive_count * PAGE_SIZE / NBYTE_PER_MB,
.compressed = vmstat.compressor_page_count * PAGE_SIZE / NBYTE_PER_MB,
.total = [NSProcessInfo processInfo].physicalMemory / NBYTE_PER_MB,
};
}
位图操作
#define Mask8(x) ((x) & 0xFF)
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8) )
#define B(x) ( Mask8(x >> 16) )
#define A(x) ( Mask8(x >> 24) )
#define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )
- (UIImage *)processUsingPixels:(UIImage *)inputImage {
/*
* 把UIImage对象转换为需要的核心图形库调用的CGImage对象,同时 得到图形的宽度和高度。
*
* */
CGImageRef inputCGImage = [inputImage CGImage];
NSUInteger width = CGImageGetWidth(inputCGImage) * 0.25;
NSUInteger height = CGImageGetHeight(inputCGImage) * 0.25;
/*
* 由于使用过的是32位RGB颜色空间模式,你需要定义一些参数
* bytesPerPixel(每个像素的大小)
* bitsPerComponent(每个颜色通道的大小)
* bytesPerRow(每行多大)
* 数组存储像素的值
*
* */
NSUInteger bytesPerPixel = 4;//字节
NSUInteger bytesPerRow = bytesPerPixel * width;//字节
NSUInteger bitsPerComponent = 8; //像素的每个颜色分量使用的bit数,RGB颜色空间下指定8
UInt32 *pixels;
pixels = (UInt32 *) calloc(height * width, sizeof(UInt32));
/*
* 创建一个RGB模式的颜色空间CGColorSpace和一个容器CGBitmapContext,将像素指针传递到容器中缓存进行存储。
*
* */
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
//***强制解压缩图片的关键代码***
CGContextRef context = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
/*
位图布局信息:
像素格式的字节顺序、alpha的信息、颜色分量是否为浮点数
typedef CF_OPTIONS(uint32_t, CGBitmapInfo) {
kCGBitmapAlphaInfoMask = 0x1F,
kCGBitmapFloatInfoMask = 0xF00,
kCGBitmapFloatComponents = (1 << 8),
kCGBitmapByteOrderMask = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big = kCGImageByteOrder32Big
} CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
//alpha的信息
typedef CF_ENUM(uint32_t, CGImageAlphaInfo) {
kCGImageAlphaNone, /* For example, RGB. */
kCGImageAlphaPremultipliedLast, /* For example, premultiplied RGBA */
kCGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */
kCGImageAlphaLast, /* For example, non-premultiplied RGBA */
kCGImageAlphaFirst, /* For example, non-premultiplied ARGB */
kCGImageAlphaNoneSkipLast, /* For example, RBGX. */
kCGImageAlphaNoneSkipFirst, /* For example, XRGB. */
kCGImageAlphaOnly /* No color data, alpha data only */
};
//字节顺序
typedef CF_ENUM(uint32_t, CGImageByteOrderInfo) {
kCGImageByteOrderMask = 0x7000,
kCGImageByteOrder16Little = (1 << 12),
kCGImageByteOrder32Little = (2 << 12),
kCGImageByteOrder16Big = (3 << 12),
kCGImageByteOrder32Big = (4 << 12)
} CG_AVAILABLE_STARTING(__MAC_10_12, __IPHONE_10_0);
*/
/*
* 把缓存中的图形绘制在显示器上,像素的填充格式有创建context的时候进行制定的
*
* */
CGContextDrawImage(context, CGRectMake(0, 0, width, height), inputCGImage);
/*
* 幽魂部分
*
* */
UIImage *ghostImage = [UIImage imageNamed:@"ghost"];
CGImageRef ghostCGImage = [ghostImage CGImage];
CGFloat ghostImageAspectRatio = ghostImage.size.width / ghostImage.size.height;
NSInteger targetGhostWidth = width * 0.25;
CGSize ghostSize = CGSizeMake(targetGhostWidth, targetGhostWidth / ghostImageAspectRatio);
CGPoint ghostOrigin = CGPointMake(width * 0.5, height * 0.2);
//创建ghost图片的缓存图
NSUInteger ghostBytesPerRow = bytesPerPixel * ghostSize.width;
UInt32 * ghostPixels = (UInt32 *) calloc(ghostSize.width * ghostSize.height, sizeof(UInt32));
CGContextRef ghostContext = CGBitmapContextCreate(ghostPixels, ghostSize.width, ghostSize.height, bitsPerComponent, ghostBytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(ghostContext, CGRectMake(0, 0, ghostSize.width, ghostSize.height), ghostCGImage);
/*
* 图像合成
*
* */
NSUInteger offsetPixelCountForInput = ghostOrigin.y * width + ghostOrigin.x;
for (NSUInteger j = 0; j < ghostSize.height; j++) {
for (NSUInteger i = 0; i < ghostSize.width; i++) {
UInt32 *inputPixel = pixels + j * width + i + offsetPixelCountForInput;
UInt32 inputColor = *inputPixel;
UInt32 *ghostPixel = ghostPixels + j * (int)ghostSize.width + i;
UInt32 ghostColor = *ghostPixel;
//Do some processing here
CGFloat ghostAlpha = 0.5f * (A(ghostColor)/255.0);
UInt32 newR = R(inputColor) * (1 - ghostAlpha) + R(ghostColor) * ghostAlpha;
UInt32 newG = G(inputColor) * (1 - ghostAlpha) + G(ghostColor) * ghostAlpha;
UInt32 newB = B(inputColor) * (1 - ghostAlpha) + B(ghostColor) * ghostAlpha;
newR = MAX(0, MIN(255, newR));
newG = MAX(0, MIN(255, newG));
newB = MAX(0, MIN(255, newB));
*inputPixel = RGBAMake(newR, newG, newB, A(inputColor));
}
}
/*
* 黑白效果
*
* */
// for (NSUInteger k = 0; k < height; k++) {
// for (NSUInteger m = 0; m < width; m++) {
// UInt32 *currentPixel = pixels + (k * width) + m;
// UInt32 color = *currentPixel;
//
// UInt32 averageColor = (R(color) + G(color) + B(color)) / 3.0;
// *currentPixel = RGBAMake(averageColor, averageColor, averageColor, A(color));
// }
//
// }
//Create a new UIImage
CGImageRef newCGImage = CGBitmapContextCreateImage(context);
UIImage *processedImage = [UIImage imageWithCGImage:newCGImage];
/*
* 清除
* */
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
CGContextRelease(ghostContext);
free(pixels);
free(ghostPixels);
return processedImage;
//画布
// UIGraphicsBeginImageContext(CGSizeMake(width, height));
//
// NSLog(@"Brightness of image:");
//
// /*
// * 定义一个指向第一个像素的指针,并使用2个for循环来遍历像素
// * */
//
// UInt32 * currentPixel = pixels;
//
// for (NSUInteger j = 0; j < height; j++) {
// for (NSUInteger i = 0; i < width; i++) {
// /*
// * 得到当前像素的值赋给currentPixel并把它的亮度值打印出来
// *
// * */
// UInt32 color = *currentPixel;
// printf("%3.0f ",(R(color)+ G(color)+ B(color))/3.0);
//
// /*
// * 增加currentPixel的值,使它指向下一个像素。指针运算(32位)+ 1 表示移动4个字节
// *
// * */
// currentPixel++;
//
// }
// printf("\n");
// }
}
ImageIO 全家福
ImageIO.png
监听runloop状态
CFRunLoopRef runloop = CFRunLoopGetCurrent();
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"进入runLoop");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"处理timer事件");
break;
case kCFRunLoopBeforeSources:
NSLog(@"处理source事件");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"进入睡眠");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"被唤醒");
break;
case kCFRunLoopExit:
NSLog(@"退出");
break;
default:
break;
}
});
CFRunLoopAddObserver(runloop, observer, kCFRunLoopCommonModes);
CFRelease(observer);
v@:
WKWebView 加载不全和闪烁问题
UI层级树.png 相关状态.pngH5页面出现,滑动闪烁以及概率性的显示不全
出现问题时,一个显著的标志就是顶层的UIScrollVIew ---> contentSize:{0, 0}
【最终结果是 前端修改CSS样式予以解决】
iPhone 尺寸大全
size.png
依赖同步解决方法
a. NSOperation 操作队列,依赖API
b. 组队列,任务通知机制。
c. GCD栅栏,任务阻塞机制。
d. 信号量机制
e. 设置标记位 【有时并不那么靠谱】
全站输出流控制
#if defined(DEBUG)
#define SYLog(format, ...) NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];\
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];\
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];\
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSSZ"]; \
NSString *str = [dateFormatter stringFromDate:[NSDate date]];\
printf("%s [%s:(%d)] %s:%s\n",[str UTF8String],[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String])
#define NSLog(...) NSLog(__VA_ARGS__);
#else
#define SYLog(...)
#define NSLog(...)
#endif
网友评论