1. main(int argc, char * argv[]){} (因为程序名总是用作启动参数传递,所以argc的值至少是1)
2. NSLog(@"some strings"); @"" --> NSString ; "%@"-->是NSString 的占位符;
3. NSString *getColorName(ShapeColor colorname){return @"red";}
4. @interface Circle : NSObject ; @implementation Circle (实现各个接口中定义的方法)
5. - (void) setColor : (Color) color ; --> void setColor(Color color);
6.[circle setFillColor : red] 函数的调用
7. 接口的定义;
@interface Rectangle : NSObject
{
ShapeColor fillColor;
ShapeRect bounds;
}
- (void) setFillColor: (ShapeColor) fillColor;
- (void) setBounds: (ShapeRect) bounds;
- (void) draw;
@end // Rectangle
8. 实现
@implementation Rectangle
- (void) setFillColor: (ShapeColor) c
{
fillColor = c; //类似于 self-->fillColor = c
} // setFillColor
- (void) setBounds: (ShapeRect) b
{
bounds = b;
} // setBounds
- (void) draw
{
NSLog (@"drawing a rectangle at (%d %d %d %d) in %@",
bounds.x, bounds.y,
bounds.width, bounds.height,
colorName(fillColor));
} // draw
@end // Rectangle
9. [super setColor : red]
10. 组合
@interface Unicycle : NSObject{
Tire *tire;
Pedal * pedal;
}
@end //Unicycle
11. setter and getter
- (Engine *) engine
{
return (engine);
} // engine
- (void) setEngine: (Engine *) newEngine
{
engine = newEngine;
} // setEngine
12. @class Tire 类似于import 但不import更有效率
#import <Cocoa/Cocoa.h>
@class Tire;
@class Engine;
13. 一些有用的数据类型
结构体 :NSRange(location,length) CGPoint(x,y) CGSize(width,height) CGRect(CGPoint,CGSize)
类: NSString
--> + (id) stringWithFormat: (NSString *) format,... ; // + 号代表类方法,也就是静态方法
NSString *height ;
height = [NSString stringWithFormat : @"height is %d feet, %d inched",5,11];
--> -(NSUInteger) length;
--> -(BOOL) isEqualToString : (NSString *) otherString;
--> -(BOOL) hasPrefix : (NSStirng *) aString;
--> -(BOOL) hasSuffix : (NSStirng *) aString;
--> -(NSRange) rangeOfString (NSStirng *) aString;
--》-(NSString *) pathExtension; //返回文件的扩展名
NSMutableString (继承于NSString ,相当于Java中的StringBuffer)
--> +(id) stringWithCapacity : (NSUInteger) capacity;
--> -(void) appendString: (NSString *) aString;
--> -(void) appendFormat: (NSString *) aString;
--> -(void) deleteCharactersInRange: (NSRange) aRange;
NSArray (可以存放任意的Objcetive-C的对象) 数组中不能存放nil。
--> +(id) arrayWithObjects : (NSString *) aString,...,nil ;
NSArray arr = [NSArray arrayWithObjects:@"one",@"two",@"three",nil ];
NSArray arr2 = @[@"one",@"two",@"three"];
--> -(NSUInteger) count ;
--> -(id) objectAtIndex:(NSUInteger) index; arr[index]
for(NSInteger i = 0; i < [arr ocunt];i++){
NSLog(@"index %d has %@.",i,arr[i]);
}
NSMutableArray
--> +(id) arrayWithCapacity: (NSUInteger) numItems; //创建可变数组的唯一方式。
--> -(void) addObect: (id) anObject;
--> -(void) removeObjectAtIndex: (NSUInteger) index;
--_ -(void)replaceObjectAtIndex: (NSUInteger) index withObject:(id) object
--> NSEnumerator *enumeraor = [array objectEnumerator];
while(id = thingie = [enumeraor nextObject]){//do sth...}
--> for(NSString *string in array){//do sth...} //快速枚举
--> [array enumeratorObejctsUsingBlock: (^)(NSStirng *string,NSUInteger index, BOOL *stop){//do sth...}]; //代码块 并发迭代
NSDictionary
存
Tire *t1 = [Tire new];Tire *t2 = [Tire new];Tire *t3 = [Tire new];Tire *t4 = [Tire new];
--> NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys: t1,@"front-left",t2,@"front-right",t3,@"back-left",t4,@"back-right",nil];
或者
NSDictionary *tires = @{@"front-left":t1, @"front-right":t2, @"back-left":t3, @"back-right":t4};
取
--> Tire *tire = [tires objectForKey:@"back-right"];
或者
Tire *tire = tires @["back-right"];
NSMutableDictionary
--> +(id) dictionaryWithCapacity : (NSUInteger) numItems ;
--> -(void) setObject:(id) anObject forKey:(id)aKey ;
NSNumber
+(NSNumber *) numberWithChar: (char) value;
+(NSNumber *) numberWithInt: (int) value;
+(NSNumber *) numberWithFloat: (float) value;
+(NSNumber *) numberWithBool: (BOOL) value; //BOOL --> struct
+(NSNumber *) numberWithLong: (long) value;
-(char) charValue, ...
NSValue (NSNumber 的父类)
+(NSValue *)valueWithPoint:(NSPoint)aPoint;
+(NSValue *)valueWithRect:(NSRect)aRect;
+(NSValue *)valueWithSize:(NSSize)aSize;
-(NSPoint) pointValue;
-(NSRect) rectValue;
-(NSSize) sizeValue;
+(NSValue *) valueWithBytes: (const void*) value objCType:(const char *)type;
-(void)getValue:(void*)buffer;
NSRect rect =NSMakeRect(1,2,30,40);
NSValue *value= [NSValue valueWithBytes: &rect objCType:@encode(NSRect)]
[arr addObject:value];
NSNull
+(NSNull *) null; // 这个方法总是返回一样的值
NSFileManager
+(id) defaultManager;
-(NSDirectoryEnumerator *) enumeratorAtPath:(NSString *) path //home = [@"~" stringByExpandingTildeInPath]; 获得mac主目录
14. 内存管理
- (id) retain ; //引用计数+1
- (oneway void) release ; //引用计数-1
- (NSUInteger) retainCount ; //获取引用计数
- (id) autorelease ; //将对象添加到自动释放池中
自动释放池
方式①:
@autoreleasepool{}
方式②:
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
...
[pool release];
IOS应用不支持垃圾回收机制 取而代之的是ARC(automatic reference counting)自动引用计数。 在编译时帮你插入retain 和release语句。
ARC只对可保留的对象指针有效。可保留的对象指针包括
1) 代码块指针
2) Objective-C对象指针
3) 通过__attribute__((NSObject)) 类型定义的指针。
强引用 弱引用 归零弱引用 桥接转换 好难好难!!!!!
项目 打开或禁用GC Exception ARC
15. 异常
@try
{
}@catch()
{
}@finally
{
}
NSException *e = [NSException exceptionWithName : ...];
@throw e ; //or
[e raise] ;
16 对象初始化
Car *car = [[Car alloc] init] ;
-(id) init;
-(id) initWithFormat: (NSString *) format,...;
-(id) initWithContentsOfFile :(NSString *) path encoding:(NSStringEncoding) enc error: (NSError) error;
[[NSString alloc] initWithContentsOfFile:@"/tep/words.txt" encoding:NSUTF8StringEncoding error:&error]; //第三个参数:没有错误时返回nil
查看错误的方法 [error localizedDescription]
%.1f -->一位浮点型
17 @property 属性
@property float rainHandling; //申明属性的setter和getter方法 头文件中
@property float snowHandling;
@synthesize rainHandling; //实现属性的setter和getter方法 实现文件中 有了这四行话就不用自己申明属性了
@synthesize snowHandling;
@property (copy) NSString *name; //@property (readonly) NSString *name 只读属性
@property (retain) Engine *engine; //可保留指针 使用copy和retain特性, 不保留指针和其他C类型使用assign特性。 默认为assign和nonatomic
@synthesize name;
@synthesize engien; //使用 [email protected]"somestring" car.engine=[[Engin alloc] init]
@property (readonly) float bodyMassIndex;
@dynamic bodyMassIndex; //告诉编译器不要创建变量或getter方法。可以自己写getter方法。
18 类别 category //为现有的类添加新的方法的方式
@interface NSString (NumberConvenience) //NumberConvenience 是 NSString 的类别。 不可以在类别中添加实例变量,只能添加 @dynamic的属性
- (NSNumber *)lengthAsNumber;
@end
类扩展
#import <Foundation/Foundation.h>
@interface Things : NSObject
@property (assign) NSInteger thing1;
@property (readonly, assign) NSInteger thing2;
- (void)resetAllValues;
@end
----------------------------
#import "Things.h"
@interface Things ()
{
NSInteger thing4;
}
@property (readwrite, assign) NSInteger thing2;
@property (assign) NSInteger thing3;
@end
@implementation Things
@synthesize thing1;
@synthesize thing2;
@synthesize thing3;
利用类别分散实现代码
委托类别 *** 委托是一种对象,由另一个类请求执行某些操作
#import <Foundation/Foundation.h>
@interface ITunesFinder : NSObject <NSNetServiceBrowserDelegate>
@end // ITunesFinder
---------------------------------
#import "ITunesFinder.h"
@implementation ITunesFinder
- (void) netServiceBrowser:(NSNetServiceBrowser *) b
didFindService:(NSNetService *) service
moreComing:(BOOL) moreComing
{
[service resolveWithTimeout:10];
NSLog (@"found one! Name is %@", [service name]);
} // didFindService
- (void) netServiceBrowser:(NSNetServiceBrowser *) b
didRemoveService:(NSNetService *) service
moreComing:(BOOL) moreComing
{
[service resolveWithTimeout:10];
NSLog (@"lost one! Name is %@", [service name]);
} // didRemoveService
@end // ITunesFinder
----------------------------------
NSNetServiceBrowser *browser = [[NSNetServiceBrowser alloc] init];
ITunesFinder *finder = [[ITunesFinder alloc] init];
[browser setDelegate: finder];
[browser searchForServicesOfType:@"_daap._tcp"
inDomain:@"local."];
NSLog (@"begun browsing");
[[NSRunLoop currentRunLoop] run]; //run循环 程序将被阻塞到这里
----------------------------------
非正式协议 : 所有的类都有可能成为委托对象。 非正式协议是NSObject的一个类别
响应选择器: NSObject 提供了respondsToSelector:的方法,用以询问委托对象能都执行某个特定的消息
例如 [car responsToSelector: @selector(setEngien:)]
19. 协议
正式协议 类似于Java中的接口
声明:
@protocol NSCopying
- (id) copyWithZone: (NSZone *) zone;
@end
继承
@protocol MyProtocol <NSCopying[,...]>
...
@end
采用协议 (类似于Java里的实现接口)
@interface Engine : NSObject <NSCopying>
@end // Engine
@implementation Engine
- (id)copyWithZone:(NSZone *)zone
{
Engine *engineCopy = [[[self class] allocWithZone:zone] init];
return (engineCopy);
} // copyWithZone
20. 代码块 : 代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。
语法: int (^myBlock)(int) =^(int num){
return num * 7;
}
example1:
void(^pBlock)(NSString *x);
pBlock = ^(NSString *str){
NSLog(@"print:@",str)
}
pBlock("hello block")
example2:
NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
NSComparator sortBlock = ^(id string1, id string2)
{
return [string1 compare:string2];
};
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@", sortArray);
example3: //代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用
static void (^ const blocks)(int) = ^(int i)
{
if (i > 0) {
NSLog(@"num:%d", i);
blocks(i - 1);
}
};
blocks(3);
example4: //在代码块中可以使用和改变全局变量,如果是局部变量,需要加上__block; __block int local = 500;
int global = 1000;
int main(int argc, const char * argv[])
{
@autoreleasepool {
void(^block)(void) = ^(void)
{
global++;
NSLog(@"global:%d", global);
};
block();
NSLog(@"global:%d", global);
}
return 0;
}
21.KVC : KEY-VALUE-CODING 用以获取类的属性和一般属性
#import <Foundation/Foundation.h>
@class Course;
@interface Student : NSObject
{
NSString *name;
Course *course;
NSInteger point;
NSArray *otherStudent;
}
@end
---------------------------------------
#import "Student.h"
#import "Course.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *student = [[[Student alloc]init ]autorelease];
[student setValue:@"张三" forKey:@"name"];
NSString *name = [student valueForKey:@"name"];
NSLog(@"学生姓名:%@",name);
[student setValue:@"88" forKey:@"point"];
NSString *point = [student valueForKey:@"point"];
NSLog(@"分数:%@", point);
Student *student1 = [[[Student alloc]init]autorelease];
Student *student2 = [[[Student alloc]init]autorelease];
Student *student3 = [[[Student alloc]init]autorelease];
[student1 setValue:@"65" forKey:@"point"];
[student2 setValue:@"77" forKey:@"point"];
[student3 setValue:@"99" forKey:@"point"];
NSArray *array = [NSArray arrayWithObjects:student1,student2,student3,nil];
[student setValue:array forKey:@"otherStudent"];
NSLog(@"其他学生的成绩%@", [student valueForKeyPath:@"otherStudent.point"]);
NSLog(@"共%@个学生", [student valueForKeyPath:@"[email protected]"]);
NSLog(@"最高成绩:%@", [student valueForKeyPath:@"[email protected]"]);
NSLog(@"最低成绩:%@", [student valueForKeyPath:@"[email protected]"]);
NSLog(@"平均成绩:%@", [student valueForKeyPath:@"[email protected]"]);
}
return 0;
}
22.KVO:Key Value Observing
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
NSString *name;
NSString *courseName;
}
-(void)changeCourseName:(NSString*) newCourseName;
@end
----------------------------------------
#import "Student.h"
@implementation Student
-(void)changeCourseName:(NSString*) newCourseName
{
courseName = newCourseName;
}
@end
------------------------------
#import <Foundation/Foundation.h>
@class Student;
@interface PageView : NSObject
{
Student *student;
}
-(id)init:(Student*)initStudent;
@end
-----------------------------------
#import "PageView.h"
#import "Student.h"
@implementation PageView
-(id)init:(Student*)initStudent
{
if (self = [super init]) {
student = initStudent;
[student addObserver:self
forKeyPath:@"courseName"
options:NSKeyValueObservingOptionOld
|NSKeyValueObservingOptionNew context:nil];
}
return self;
}
- (void) dealloc{
[student removeObserver:self forKeyPath:@"courseName" context:nil];
[super dealloc];
}
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqual:@"courseName"]) {
NSLog(@"PageView课程被改变了");
NSLog(@"PageView新课程是:%@ 老课程是:%@", [change objectForKey:@"new"],[change objectForKey:@"old"]);
}
}
@end
------------------------------------------------
#import "Student.h"
#import "Course.h"
#import "PageView.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *student = [[[Student alloc]init]autorelease];
[student changeCourseName:@"数学课"];
NSLog(@"初始值:%@", [student valueForKey:@"courseName"]);
//创建页面实例
PageView *pageview = [[[PageView alloc]init:student]autorelease];
[student setValue:@"化学课" forKey:@"courseName"];
}
return 0;
}
-----------------------------------------------------------------------------
23. Objective-C的选择器 @selector(),
其作用相当于函数指针,现在我看到的大多说用法都是在调用某些函数需要传递一个 函数指针 参数时,使用@selector。它会在当前类里面查找selector后面所跟的函数,返回一个 SEL类型的值。
SEL变量的执行.用performSelecor方法来执行.
[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
在调用respondsToSelector:@selector(method)时,这个method只有在该方法存在参数时需要 ":",如果该方法不需要参数就不需要加这个冒号。否则,编译不会报错,只是执行返 回的值不对。当然如果方法有多个参数,需要多个冒号,参数有名称的需要带上参数名称。
如:有如下方法:
-(NSString*)toXmlString;
此时调用类似于:
[self respondsToSelector:@selector(toXmlString)]
如果toXmlString方法的定义为:
-(NSString*)toXmlString:(NSString*)prefix;
那么调用就必须加上冒号,如:[self respondsToSelector:@selector(toXmlString:)]
·-(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例
·-(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例
·-(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
·+(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在 类上.
·-(id) performSelector: selector 执行某个方法
@interface foo
-(int)add:int val;
@end
SEL class_func ; //定义一个类方法指针
class_func = @selector(add:int);
注意1. @selector是查找当前类的方法,而[object @selector(方法名:方法参数..) ] ;是取object对应类的相庆方法.
SEL shootSelector = @selector(shoot);
SEL shootAtSelector = @selector(shootAt:);
SEL moveToSelector = @selector(moveTo:withPenColor:);
[obj performSelector:shootSelector]; 无参数的SEL
[obj performSelector:shootAtSelector withObject:coordinate];有一个参数的SEL。
24.
IOS 部分 (内容大部分来自http://blog.csdn.net/totogo2010/这位博主的文章)
Views
-(void)addSubView:(UIView *)aView;
-(void)removeFromSuperview;
通过父view添加子view
通过子view自己移除自己
view的坐标系统
单位:
CGFloat ,是个float数字,在obj-c里就要用这个单位
CGPoint,是个C结构体,CGPoint p = CGPointMake(33.2.22.3); 表示位置。
CGSize, 是个结构体,表示大小。
CGRect :由一个 CGPoint和一个CGSize组成
CGRect labelRect = CGRectMake(20, 20, 50, 30);
UILabel *label = [[UILabel alloc] initWithFrame:labelRect];
label.text = @”Hello!”;
[self.view addSubview:label];
drawRect
怎么绘图呢?覆盖一个方法:-(void)drawRect:(CGRect)aRect;
红色警告:决不能自己调用drawRect:。系统调用这个方法。如果你需要重绘怎么办?发送这两个消息
view plain copy
- (void)setNeedsDisplay;
- (void)setNeedsDisplayInRect:(CGRect)aRect;
CGContextRef context = UIGraphicsGetCurrentContext();
画文字
用UILabel
UIFont *myFont = [UIFont systemFontOfSize:12.0];
UIFont *theFont = [UIFont fontWithName:@“Helvetica” size:36.0];
NSArray *availableFonts = [UIFont familyNames];
NSString *text = ...;
[text drawAtPoint:(CGPoint)p withFont:theFont]; // NSString instance method
画图像
UIImageView
UIImage *image = [UIImage imageNamed:@“foo.jpg”];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:(NSString *)fullPath];
UIImage *image = [[UIImage alloc] initWithData:(NSData *)imageData];
UIGraphicsBeginImageContext(CGSize);
// draw with CGContext functions
UIImage *myImage = UIGraphicsGetImageFromCurrentContext();
UIGraphicsEndImageContext();
[image drawAtPoint:(CGPoint)p];
[image drawInRect:(CGRect)r];
[image drawAsPatternInRect:(CGRect)patRect;
手势识别
- (void)setPannableView:(UIView *)pannableView
{
_pannableView = pannableView;
UIPanGestureRecognizer *pangr =
[[UIPanGestureRecognizer alloc] initWithTarget:pannableView action:@selector(pan:)];
[pannableView addGestureRecognizer:pangr];
}
UIPinchGestureRecognizer 缩放
UIRotationGestureRecognizer 旋转手势,两个手指按下,然后旋转,是个弧度,不是角度。
UISwipeGestureRecognizer 滑动手势, 一个或多个手指滑动,
UITapGestureRecognizer 点击手势
NINetworkImageView 是Nimbus下载图片的类
plist文件是什么呢? 它全名是:Property List
<strong>- (void)viewDidLoad
{
[super viewDidLoad];
//读取plist
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plistdemo" ofType:@"plist"];
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSLog(@"%@", data);
//添加一项内容
[data setObject:@"add some content" forKey:@"c_key"];
//获取应用程序沙盒的Documents目录
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *plistPath1 = [paths objectAtIndex:0];
//得到完整的文件名
NSString *filename=[plistPath1 stringByAppendingPathComponent:@"test.plist"];
//输入写入
[data writeToFile:filename atomically:YES];
//那怎么证明我的数据写入了呢?读出来看看
NSMutableDictionary *data1 = [[NSMutableDictionary alloc] initWithContentsOfFile:filename];
NSLog(@"%@", data1);
// Do any additional setup after loading the view, typically from a nib.
}
</strong>
获取程序的Home目录
NSString *homeDirectory = NSHomeDirectory
获取document目录();
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
获取Cache目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
获取Library目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
获取Tmp目录
NSString *tmpDir = NSTemporaryDirectory();
写入文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@"Documents 目录未找到");
}
NSArray *array = [[NSArray alloc] initWithObjects:@"内容",@"content",nil];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
[array writeToFile:filePath atomically:YES];
读取文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
NSLog(@"%@", array);
在Documents里创建目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory%@",documentsDirectory);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
// 创建目录
[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
在test目录下创建文件
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"];
NSString *string = @"写入内容,write String";
[fileManager createFileAtPath:testPath contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
获取目录列里所有文件名
两种方法获取:NSFileManager 的 subpathsOfDirectoryAtPath 和 subpathsAtPath 方法
fileManager使用操作当前目录
//创建文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//更改到待操作的目录下
[fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];
//创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil
NSString * fileName = @"testFileNSFileManager.txt";
NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];
[fileManager createFileAtPath:fileName contents:array attributes:nil];
//changeCurrentDirectoryPath目录更改到当前操作目录时,做文件读写就很方便了,不用加上全路径
[fileManager removeItemAtPath:fileName error:nil]; //删除文件
混合数据的读写
NSString * fileName = @"testFileNSFileManager.txt";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//获取文件路径
NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];
//待写入的数据
NSString *temp = @"nihao 世界";
int dataInt = 1234;
float dataFloat = 3.14f;
//创建数据缓冲
NSMutableData *writer = [[NSMutableData alloc] init];
//将字符串添加到缓冲中
[writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];
//将其他数据添加到缓冲中
[writer appendBytes:&dataInt length:sizeof(dataInt)];
[writer appendBytes:&dataFloat length:sizeof(dataFloat)];
//将缓冲的数据写入到文件中
[writer writeToFile:path atomically:YES];
//读取数据:
int intData;
float floatData = 0.0;
NSString *stringData;
NSData *reader = [NSData dataWithContentsOfFile:path];
stringData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]
encoding:NSUTF8StringEncoding];
[reader getBytes:&intData range:NSMakeRange([temp length], sizeof(intData))];
[reader getBytes:&floatData range:NSMakeRange([temp length] + sizeof(intData), sizeof(floatData))];
NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);
NSBundle介绍和使用
bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle,
cocoa提供了类NSBundle.
// 通过使用下面的方法得到程序的main bundle
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *imagePath = [mainBundle pathForResource:@"QQ20120616-1" ofType:@"png"];
NSLog(@"%@", imagePath);
UIImage *image = [[UIImage alloc]initWithContentsOfFile:imagePath];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:imageView];
UINavigationController
UIDatePicker
WebView
UIPickerView
Resource 中的Settings Bundle 打开这个程序的设置
NSThread 有两种直接创建方式:
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
NSOperation
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self
selector:@selector(downloadImage:)
object:kURL];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation];
Grand Central Dispatch
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
应用程序的状态
状态如下:
Not running 未运行 程序没启动
Inactive 未激活 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态
Active 激活 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式
Backgroud 后台 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态
Suspended 挂起 程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
各个程序运行状态时代理的回调:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理进程启动但还没进入状态保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告诉代理启动基本完成程序准备开始运行
- (void)applicationWillResignActive:(UIApplication *)application
当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
- (void)applicationDidBecomeActive:(UIApplication *)application
当应用程序入活动状态执行,这个刚好跟上面那个方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
当程序载入后执行
NSDate工厂类方法:
+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;
+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
NSData提供下面的工厂方法:
+ (id)dataWithBytes:(const void *)bytes length:(unsigned)length;
+ (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length;
+ (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length
freeWhenDone:(BOOL)b;
+ (id)dataWithContentsOfFile:(NSString *)path;
+ (id)dataWithContentsOfURL:(NSURL *)url;
+ (id)dataWithContentsOfMappedFile:(NSString *)path;
内省是对象自己检查自己做为运行时对象详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别。
实现单例的代码例子:
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
[[self alloc] init]; // assignment not done here
}
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
sharedGizmoManager = [super allocWithZone:zone];
return sharedGizmoManager; // assignment and return on first allocation
}
}
return nil; //on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
ARC技术结合GCD来实现单例模式:
+ (id)sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init]; // or some other init method
});
return _sharedObject;
}
动画
[UIView beginAnimations:@"animation" context:nil];
[UIView setAnimationDuration:1.0f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
[UIView commitAnimations];
动画的常量有以下5种
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
交换本视图控制器中2个view位置
[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
在commitAnimations消息之前,可以设置动画完成后的回调,设置方法是:
[UIView setAnimationDidStopSelector:@selector(animationFinish:)];
CALayer
CAAnimation
CAAction 协议。该协议为图层触发一个动画动作提供了提供标准化响应。
CATransition 提供了一个图层变化的过渡效果,它能影响图层的整个内容。 动画进行的时候淡入淡出(fade)、推(push)、显露(reveal)图层的内容。
CAAnimationGroup 允许一系列动画效果组合在一起,并行显示动画。
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim,scaleAnim,opacityAnim, nil];
animGroup.duration = 1;
[view.layer addAnimation:animGroup forKey:nil];
使用手势很简单,分为两步:
创建手势实例。当创建手势时,指定一个回调方法,当手势开始,改变、或结束时,回调方法被调用。
添加到需要识别的View中。每个手势只对应一个View,当屏幕触摸在View的边界内时,如果手势和预定的一样,那就会回调方法。
Macbook SSD硬盘空间不够用了?来个Xcode大瘦身吧! :
https://mp.weixin.qq.com/s?__biz=MzA5OTU3NjAxNA==&mid=2653645902&idx=1&sn=b880260a997bcaf0dab4a788444d4bbb&scene=0&key=b28b03434249256b7333889a11e33c97056cbf31bb6205da175c1d50f0cf314f26de5cf422b9c6a8cf584f447d9c828c&ascene=0&uin=OTgxODI2NDQw&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.11.4+build%2815E65%29&version=11020201&pass_ticket=%2B9iZ5oHULJgM8PEtJyiEiooAxl%2FEDiui7%2FVM4jE5i5LdowfuzDEK1L04O7u4GHws
android
cardview : http://blog.csdn.net/a396901990/article/details/40153759
RTEditor
IOS framework : http://foggry.com/blog/2014/04/25/githubyou-xiu-xiang-mu-ios/