UISearchBar

UISearchBar没有光标显示

searchBar_.tintColor = [UIColor grayColor];

新技术概念

iOS的函数响应型编程
https://kevinhm.gitbooks.io/functionalreactiveprogrammingonios/content/index.html

根据苹果官方文档由于用户自己产生的数据才是应该存在document下,而App安装的包中的资源应该放在library下的 caches目录,因为这些资源删除过后还可以找回来。在library下还有另外一个文件夹preferences,存放 nsuserdefault的plist数据属于程序的默认设置或是其他状态信息。还有个temp的文件夹,里面存放就是临时数据,这些数据再程序关闭后 当第二次打开时会消失。

NSMutableArray

降序排序

代码示例:

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        ItemData* data1=obj1;
        ItemData* data2=obj2;
        if(data1.unreadCount>data2.unreadCount)
        {
            return NSOrderedAscending;
        }
        else if(data1.unreadCount<data2.unreadCount)
        {
            return NSOrderedDescending;
        }
        return NSOrderedSame;
    }];

语法

xcode中动态内存有如下与c++不同的情况

结构和基础类型可以以静态的形式动态分配,NSObject则不可以。

typedef struct {
    CLLocationDegrees latitude;
    CLLocationDegrees longitude;
} CLLocationCoordinate2D;

int p[len];
CLLocationCoordinate2D pointsToUse[len];

浮点数格式化四舍五入问题

id str=[NSString stringWithFormat:@”%.2f”,1.999]; 结果str为2.00

使用NSNumberFormatter可设置更多如何对数字格式化。

Swift

Swift中三元运算符中问号前要有空格。

UIImagePickerController

UIImagePickerController拍照后内存警告黑屏问题解决办法:

当self.presentedViewControlle是UIImagePickerController 类型时,不做内存警告处理。

代码如下:

- (void)didReceiveMemoryWarning
{
 [super didReceiveMemoryWarning];
 
 UIViewController* n=self.navigationController;
    UIViewController* s=n.tabBarController.selectedViewController;
    UIViewController* t=self.navigationController.topViewController;
    UIViewController* v=self.presentedViewController;
    
    if(t==self
       && (s==n || !s)
       && ([v isKindOfClass:[UIImagePickerController class]] || [v isKindOfClass:[CTAssetsPickerController class]]))
    {
        NSLog(@"ignore didReceiveMemoryWarning %@",self.description);
        return;
    }
 
 NSString* systemVersion = [[UIDevice currentDevice] systemVersion];
 CGFloat sysVersion = [systemVersion floatValue];
 if (sysVersion >= 6.0)
 {
 if (![self.view window]) // 非正在使用的视图
 {
 [self viewDidUnload];
 // Add code to preserve data stored in the views that might be
 // needed later.
 
 // Add code to clean up other strong references to the view in
 // the view hierarchy.
 self.view = nil;// 使再次进入时能够重新加载调用loadView,viewDidLoad
 }
 }
}

UIButton

设置UIButton上图片居右

@implementation UIButton (Custom)
-(void)setImageAlignRight
{
    CGRect frame=self.frame;
    NSString* title=[self titleForState:UIControlStateNormal];
    UIImage* image=[self imageForState:UIControlStateNormal];
    UIFont* font=self.titleLabel.font;
    
    CGSize labelSize = [title sizeWithFont:font constrainedToSize:CGSizeMake(1000, frame.size.height) lineBreakMode:NSLineBreakByWordWrapping];
    float buttonWidth=labelSize.width+image.size.width;
    frame.size.width=buttonWidth;
    self.frame=frame;
    
    [self setImageEdgeInsets:UIEdgeInsetsMake(0, labelSize.width, 0, -labelSize.width)];
    [self setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, image.size.width)];
}

@end

tableCell中的button在点击时背景色丢失问题

修改为使用背景色为使用背景图片解决:

[button setBackgroundImage:[UIImage imageFromColor:DecorateColor size:button.bounds.size] forState:UIControlStateNormal];
    //如果设置了圆角,还要设置clipsToBounds
    [button.layer setCornerRadius:5];
    button.clipsToBounds=YES;

设置UIButton中的文字居左

需要设置内容属性,而不是titleLabel的属性。内容属性的声明在UIControl中。

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
button.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);

iOS 多线程、GCD

iOS的多线程技术

1.NSThread;
还有两种苹果专门开发的“并发”技术,程序员可以不再去关心线程的具体使用
2.NSOperation/NSOperationQueue 面向对象的线程技术
3.GCD —— Grand Central Dispatch(派发) 基于C语言的框架,可以充分利用多核,苹果推荐使用。

GCD:Grand Central Dispatch

在Cocoa Touch中,Foundation框架比如NSString,NSArray通常被认为是线程安全的,UIKit框架中UIApplication,UIView被视为不是线程安全的。这意味着,处理UIKit对象的方法调用都应从主线程内执行。
ios4.0开始引入了GCD,GCD是为了在“多核”上使用多线程技术,所有的方法都是dispatch开头。
CGD在c接口中添加了一些概念:工作单元,无痛后台处理,自动线程管理。
GCD的一个重要概念是队列,添加到队列的工作单元按加入顺序启动,但不总按这个顺序完成。因为如果可能,队列将自动在多个线程之间分配它的工作。
每个队列能访问一个线程池。
苹果还向c语言添加了一些新语法,程序块,有的也叫闭包,lambda。
程序块可以分配给一个变量,可用作objc中的委托模式或c中的回调函数的替代途径。
程序块和c中的函数指针的区别:程序块可以在代码内以内联方式定义,在即将传递使用前的位置定义它;程序块可以在创建它的范围内的可用变量。默认情况下程序块复制这些变量,可以通过存储修饰符__block声明变量,以使程序块对它可写。

GCD函数
dispatch_async,
dispatch_get_global_queue 抓取一个已存在并始终可用的全局队列,
dispatch_get_main_queue 提供存在于主线程上的特殊队列
dispatch_group_create,dispatch_group_t,
dispatch_group_async 分派组,把组内的程序块设置为松散的,尽可能让它们并发执行,
dispatch_group_notify 指定一个程序块运行于组内的所有程序块完成时。

3.Dispatch Queues

GCD的基本概念就是dispatch queue。dispatch queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。并发任务会像NSOperationQueue那样基于系统负载来合适地并发进行,串行队列同一时间只执行单一任务。
GCD中有三种队列类型:

  • The main queue: 与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。
  • Global queues: 全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。
  • 用户队列: 用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这种队列,所以我们称其为用户队列) 是用函数 dispatch_queue_create 创建的队列. 这些队列是串行的。正因为如此,它们可以用来完成同步机制, 有点像传统线程中的mutex。

导航

设置导航标题的颜色

[self.navigationController.navigationBar setTitleTextAttributes:@{
    NSForegroundColorAttributeName:[UIColor whiteColor]
}];

编译、运行错误

xcode编译,报ld: file is universal (3 slices) but does not contain a(n) armv7s slice: 错误
解决办法有三个:
1.升级涉及到的.a文件
2.在target的Build Settings里面,将Build Active Architecture Only改成YES
3.在target的Build Settings里面,找到Valid Architectures,删除其中的armv7s

列出内存块的生命周期,来查找运行时错误

malloc_history pid memory_address

《程序员读》

《程序员读》

——精心为程序员打造的编程开发阅读软件。
挖掘细致的阅读习惯,
热门开发分类,
每日内容更新,
在线视频观看,
下载离线阅读,
片段选择分享,
网络收藏摘抄,
开发文章发表,
附近猿媛查看,
兴趣好友联系,
二维码快速扫描,
日夜间模式摇一摇轻松切换。


iPhone版 v1.94

扫一扫 http://t.cn/8k1VM8d

《程序员读》精心为程序员打造,隆重登陆AppStore


Android版 v1.43

扫一扫 http://t.cn/R74JjLj

《程序员读》精心为程序员打造