Note0
NSTimer 我们通常会用在背景计算,更新一些数值资料,而如果牵涉到画面的更新,动画过程的演变,我们通常会用CADisplayLink。
关联 objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects
关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。
在类的定义之外为类增加额外的存储空间
使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。
设置splash
//now fade out splash image [UIView transitionWithView:self.window duration:1.0f options:UIViewAnimationOptionTransitionNone animations:^(void){imageView.alpha=0.0f;} completion:^(BOOL finished){[imageView removeFromSuperview];}];
计算合适的字体大小:
NSString *string = @"The string to render"; CGRect rect = imageView.frame; UIFont *font = [UIFont fontWithSize:12.0]; // find the height of a 12.0pt font CGSize size = [string sizeWithFont:font]; float pointsPerPixel = 12.0 / size.height; // compute the ratio float desiredFontSize = rect.size.height * pointsPerPixel; http://tiny4cocoa.com/faq/show/47/ [webView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] resourcePath]]];这样baseURL就指向了程序的资源路径,这样Html代码就和css是一个路径的。当然baseURL也可以写一个网络路径,这样就可以用网络上的CSS了。
Xcode5正式版UITableView顶部为什么有一段空白
解决方法: self.edgesForExtendedLayout = UIRectEdgeNone;
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) self.window.rootViewController = navigationController; else [self.window addSubview:navigationController.view]; NSArray arr = @[@“one”, @“two”, @“three”]; NSMutableArray mutArr = [NSMutableArray new]; mutArr = [@[@“one”, @“two”, @“three”] mutableCopy];
ARC中,不用定义实例变量:[urlsToPrefetch copy], 否则会同urlsToPrefetch一起销毁
__strong, __weak, __unsafe_unretained, __autoreleasing dealloc时: 1.assign会release, 向指针发message时会崩溃, 2.weak向nil发message不会崩溃。 3.unsafe_unretain不会分配指针为nil,与assign类似 strong, weak,unsafe_unretained 1.use strong instead of retain, 2.use assign for C primitive properties, 3.weak for weak references to Objective-C objects. 代理设置: @interface SomeClass : NSObject { id <SomeClassDelegate> __unsafe_unretained delegate; } @property (unsafe_unretained) id <SomeClassDelegate> delegate; @interface SomeClass : NSObject { id <SomeClassDelegate> __unsafe_unRetained delegate; } 的引用 __block typeof(self) tmpSelf = self; [self methodThatTakesABlock:^ { [tmpSelf doSomething]; }];
一个块对它所捕捉的变量构成强引用。如果在块内使用 self,该块对 self 构成强引用。
因此,如果 self 也具有对该块的强引用(通常都有),将产生强引用循环。
要避免循环,您需要在块外创建对 self 的 weak(或 __block)引用,如以上例子所示。
UIKit 的 UILabel 允许你通过在 IB 中简单的拖曳添加文本,但你不能改变文本的颜色和其中的单词。
Core Graphics/Quartz几乎允许你做任何系统允许的事情,但你需要为每个字形计算位置,并画在屏幕上。
Core Text 正结合了这两者!你可以完全控制位置、布局、类似文本大小和颜色这样的属性,
而 Core Text 将帮你完善其它的东西——类似文本换行、字体呈现等等。
Core Text 对于创建杂志和书籍应用十分方便——它们在 iPad 上非常受欢迎!
[[[self class] alloc] init];
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。
在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),
所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类。NSNull只有一个方法:
+ (NSNull *) null; NSDictionary dictionary = @{@“iPhone”, @“first”, @“iPad”, @“iPod”}; NSString *value = [dictionary objectForKey:@"First"]; if ((NSNull *)value == [NSNull null]) { }
表结构:NSEntityDescription 实体对象,表名
表记录:NSManagedObject 一个管理对象代表你想要保存到数据存储中的一个对象,类似于SQL中的一条记录,并且包含一些对象属性
表查询:NSFetchRequest
数据库存储方式:NSPersistentStoreCoordinator 持久化存储协调者 ,包含数据存储的名字和位置,
数据库模型:NSManagedObjectModel 管理对象数据模型,包含一个你想存储到数据存储中的管理对象的定义
数据库操作:NSManagedObjectContext 管理对象的上下文,类似于应用程序和数据存储间的一块缓冲区,你可以增删改查管理对象
// Persistent store types supported by Core Data: COREDATA_EXTERN NSString * const NSSQLiteStoreType NS_AVAILABLE(10_4, 3_0); COREDATA_EXTERN NSString * const NSXMLStoreType NS_AVAILABLE(10_4, NA); COREDATA_EXTERN NSString * const NSBinaryStoreType NS_AVAILABLE(10_4, 3_0); COREDATA_EXTERN NSString * const NSInMemoryStoreType NS_AVAILABLE(10_4, 3_0);
在ios4.0及以后鼓励使用animateWithDuration方法来实现动画效果。当然,以往的begin/commit的方法依然使用
UIGestureRecognizer是一个定义基本手势的抽象类,具体什么手势,在以下子类中包含:
1、拍击UITapGestureRecognizer (任意次数的拍击) 2、向里或向外捏UIPinchGestureRecognizer (用于缩放) 3、摇动或者拖拽UIPanGestureRecognizer (拖动) 4、擦碰UISwipeGestureRecognizer (以任意方向) 5、旋转UIRotationGestureRecognizer (手指朝相反方向移动) 6、长按UILongPressGestureRecognizer (长按)
Core Foundation 是一套C 函数,
ARC使用 __bridge 关键字来实现id类型与void*类型的相互转换。看下面的例子。
id obj = [[NSObject alloc] init]; void *p = (__bridge void *)obj; id o = (__bridge id)p; 除过 __bridge 以外,还有两个 __bridge 相关的类型转换关键字: __bridge_transfer __bridge_retained NSString *string = [NSString stringWithFormat:...]; CFStringRef cfString = (__bridge CFStringRef)string; https://alpha-api.app.net/ NSURLRequest NSURLResponse NSURLConnectionDelegate NSURLConnectionDataDelegate NSURLSessionDownloadTask NSURLSessionDataTask NSURLCache NSCachedURLResponse NSURLSessionConfiguration NSURLSessionDataTask
GCD(Grand control dispatch)
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block); dispatch_queue_t dispatch_get_global_queue( long priority, //优先级 unsigned long flags); //保留字 dispatch_get_main_queue(); //UI主线程
dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,
这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
取图像:
UIImage *image = [UIImage imageNamed:@“foo.jpg”]; UIImage *image = [[UIImage alloc] initWithContentsOfFile:(NSString *)fullPath]; UIImage *image = [[UIImage alloc] initWithData:(NSData *)imageData];
context取图像:
UIGraphicsBeginImageContext(CGSize); UIImage *myImage = UIGraphicsGetImageFromCurrentContext(); UIGraphicsEndImageContext();
画图像:
[image drawAtPoint:(CGPoint)p]; [image drawInRect:(CGRect)r]; [image drawAsPatternInRect:(CGRect)patRect; UIFont *myFont = [UIFont systemFontOfSize:12.0]; UIFont *theFont = [UIFont fontWithName:@“Helvetica” size:36.0]; NSArray *availableFonts = [UIFont familyNames]; 获取可用的字体 【UIFont BlodSystemFontofSize:12.0】 NSArray *avilableFonts = [UIFont familyNames];
通过父view添加子view
通过子view自己移除自己
NSValue *value = [NSValue valueWithBytes:&myTestStruct objCType:@encode(MyTestStruct)]; [value getValue:&theTestStruct]; [NSValue valueWithCGPoint] SEL shootSelector = @selector(shoot); 无参数 SEL shootAtSelector = @selector(shootAt:); 有参数 SEL moveToSelector = @selector(moveTo:withPenColor:); isKindOfClass: returns whether an object is that kind of class (inheritance included) isMemberOfClass: returns whether an object is that kind of class (no inheritance) respondsToSelector: returns whether an object responds to a given method id可以是任何对象,包括非NSObject对象 typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) { UITableViewCellEditingStyleNone, UITableViewCellEditingStyleDelete, UITableViewCellEditingStyleInsert };
alloc调用allocWithZone, NSZone即内存块, 可以重写allocWithZone, 来管理内存,防止内存的碎片化。
controller.view -->superView -->subViews controller —>parentViewController —>childViewControllers
没有定义成员变量时,
如果只申明@property id obj, 没有申明@synthsize obj, 系统会自动生成成员变量_obj。
如果申明了@synthesize obj, 系统会自动生成成员变量obj,而不是_obj。
初始化时用成员变量obj, 如果用self.obj=[[NSObject alloc] init], 因为这样retainCount=2;
1.NSString类型转化为C字符串 NSString *str = @"good"; char *cString=[str UTF8String]; 2.C字符串转为NSString类型 char *cString = "这里是C类字符串"; NSString *str =[NSString stringWithUTF8String:cString]; 或者: NSString *str =[[NSString alloc]initWithFormat:"%s",cString]; char *cString = [str UTF8String];
“库”文件夹是隐藏的。要显示,请在单击“前往”菜单的同时按住 Option 键。
委托因此是一种将应用程序特定行为加入框架类工作的手段,
而无需给该类创建子类。它是一种常见的、强大的设计,来扩展和影响框架的行为。
但是委托并不局限于框架类。您可以在应用程序的两个自定对象之间实施委托。
Cocoa Touch 应用程序常见的设计,是将委托作为一种手段,允许子视图控制器将某些值(通常为用户输入的值)传达到父视图控制器。
协议因此和委托一样,可作为子类化的替换手段,通常是框架实施委托的一部分。
观察者模式
通知中心:通知对事件感兴趣的观察者
从编程角度而言,它是 NSNotificationCenter 类的实例
任何对象都可以观察通知,但要做到这一点,该对象必须注册,以接收通知。
在注册时,它必须指定选择器,以确定由通知传送所调用的方法;方法签名必须只有一个参数:通知对象。注册后,观察者也可以指定发布对象。
键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性。
该属性值改变时,会通知观察对象。它了解新值以及旧值;
如果观察的属性为对多的关系(例如数组),它也要了解哪个包含的对象发生了改变。
KVO 有助于使应用程序变得更内聚,保持模型、控制器和视图层中的对象与改变同步。
与 NSNotificationCenter 通知相似,多个 KVO 观察者可以观察单一属性。
此外,KVO 更动态,因为它允许对象观察任意属性,而不需任何新的 API,
例如通知名称。KVO 是一个轻量级点对点通信机制,不允许观察所有实例的特定属性。
drawRect: setNeedsDisplay: setNeedsDisplayInRect