1、一个类的定义一般分成两部分:
@interface 部分
1、确定这个类继承自谁,使用冒号":"
2、确定拥有的数据,包括在"{}"中
3、确定可以执行的动作
- 实例方法
+ 类方法
4、以@end结尾
@implementation部分
2、程序中有GC机制,但是最好自己管理内存。IPhone等也不支持GC。
3、OC中一般get方法的名称和对应的属性的名称相同。
4、OC中的模运算只支持整数运算。
5、通过键盘输入值:
int num = 0;
NSLog(@"Please input a number,type is integer!!!");
scanf("%i",&num);
6、OC中的bool类型表示:
真值:非0数字、TRUE、true、YES
假值:0、FALSE、false、NO
7、在类的@implementation一般不会重复声明实例变量(虽然可以这么做),在其他地方引用的时候一班都会引用头文件而不是@implementation文件。
8、import中使用<>和""的区别是:<>首先查找系统头文件,而""首先在当前目录下查找。
9、@property 属性名称1,属性名称2,...;在@interface文件中声明属性的setter和getter
@synthesize 属性名称1,属性名称2,...;在@implementation文件中实现默认的setter和getter
以上的指令只是针对基本类型。
10、OC中可以通过"实例名.属性名"来访问属性。
11、方法的声明
修饰符(-/+) (返回类型或void) 方法名第一部分:(类型) 参数名称
方法名第二部分:(类型) 参数名称
方法名第三部分:(类型) 参数名称
......
{
方法体
}
可以省略方法名称除了第一部分之外的所有的部分。如果方法的参数类型或者返回值是引用类型,需要在类型名称后添加一个*
修饰符(-/+) (返回类型或void) 方法名第一部分:(类型) 参数名称
:(类型) 参数名称
:(类型) 参数名称
......
{
方法体
}
12、局部变量没有初始值,在声明的时候必须给予赋值。方法的参数是局部变量,方法没有办法修改方法的参数。
13、一般将static变量生命在@implementation的外面,这样类中的所有的方法和属性都可以访问它。
14、self关键字调用自己的方法或者变量。
15、OC中使用的坐标系是笛卡尔坐标是,即一个图形的左下定点是这个图形的原点(0,0)。
16、@class指令可以代替import "类名称.h",这样会提高效率,因为让引用这个类的类知道它是一个方法而已;
如果要引用这个类中的方法则需要使用import,这样才能知道这个类中的方法、变量等。
17、重写dealloc方法,释放本身内存,并调用[super release]。
18、在新建一个对象的时候需要首先判断是不是nil,如果不为nil,则需要先进行一次内存的释放。
19、多态:来自不同类的对象可以共享名称相同的方法;
动态类型:直到执行的时候才知道对象所属的类型
动态绑定:直到执行的时候才知道方法所属的对象
20、处理动态类型的方法:
-(BOOL) isKindOf:class-object 对象是不是class-object或其子类的成员
-(BOOL) isMemberOfClass:class-object 对象是不是class-object的成员
-(BOOL) respondsToSelector:selector 对象能否相应selector所指定的方法
+(BOOL) instancesRespondToSelector:selector 指定的类实例是否能响应selector
+(BOOL) isSubclassOfClass:class-object 对象是指定类的子类吗
-(id) performSelector:selector 应用selector指定的方法
-(id) performSelector:selector withObject:object 应用selector指定的方法,传递参数object
-(id) performSelector:selector widthObject:object1 widthObject:object2 应用selector指定的方法,传递参数object1和object2
获取class-object:[类名称 class]或者[对象名称 class]
获取selector:可以对一个方法名应用@selector指令:@selector(方法名称),注意方法名称中的冒号":"
selector的返回值是一个SEL类型的。
21、异常处理:发生异常不会终止程序,而是跳转到catch中进行处理。
@try{
statement;
statement;
}
@catch(NSException *exception){
statement;
statement;
NSLOg(@"name:%@,reason:%@",[exception name],[exception reason]);
}
@throw 抛出自己的异常
可以使用 @finally 语句块包含是否执行抛出异常的 @try 块。
22、初始化方法例子:
- (Person *) initWithName:(NSString *) name AndCompany : (NSString *) company
{
self = [super init];
if(self){
[self setName:@"zhangsan" company:@"lenovo"];
}
return self;
}
23、实例变量的访问作用域:
@protected:可以被当前类以及子类的任何方法进行引用,这个也是默认情况。
@private:只可以被当前类的方法引用,子类以及其他类无法引用。
@public:可以被当前类、子类、以及其他模块的方法进行引用。
@package:对于64位图像可以在实现该类的图像的任何地方访问这个实例变量。
24、定义在一个类的源文件的所有的方法、属性、类之前的变量叫做全局变量,可以被其他模块和本模块进行访问。例如在A类中声明: int numA = 1000;
在其他类使用这个全局变量的时候,应该声明一下这个变量,需要在前面添加一个extern关键字。例如在B类中:extern int numA;(此处只要声明不要赋值,否则会有警告)
如果全局变量在声明类中使用,则不需要添加一个extern关键字。
25、static的变量定义在所有的函数之外,但不能被其他模块进行访问,只能在当前声明它的模块进行使用。
26、auto关键字与static相反,是实例变量与实例方法的默认声明方式,并且没有人使用它。
27、const用来修饰一个常量,声明之时必须给予初始化,并且在声明后不可以进行修改值的操作,否则会报错。
28、volatile与const相反,说明这个被修饰的量是一个变量,避免编译器优化掉看似多余的变量赋值,同时避免重复检查没有值变化的变量。
29、typedef语句:typedef 类型名称 自定义的类型名称。
30、分类:
#import "类名称.h"
@interface 类名称 (分类名称)
{
}
#improt "类名称.h"
@implementation 类名称 (分类名称)
{
}
注意点:不能新定义实例变量、最好不要类中的方法、必须和类名称保持一致、可以不实现分类中的所哟肚饿方法。
31、协议:多个类共享的一个方法列表。协议中的方法没有相应的实现,由他人来进行实现。如果决定要实现协议中的所有方法就意味着要遵守(confirm to)或采用(adopt)这项协议。
定义: @protocol 协议名称
// @optional 之后定义的方法可以不必实现
// @required 之后的定义的方法必须实现
@end
采用一个协议:
@interface 类名称 : 实现类 <协议名称1,协议名称2,协议名称3,...>
@end
判断一个对象是否采用了一个协议:
if([对象名称 confirmsTo : @protocol (协议名称)] == YES){
// @protocol (协议名称) 会得到协议名称并返回一个Protocol的对象
}
让编译器帮助检查是否遵循某项协议:
id<协议名称> 对象名称;如果没有遵循指定的协议名称会有警告信息。
协议和分类都可以遵守一个协议。
非正式协议实际上就是一个分类,可以不实现非正式协议的方法。在Objective-C 2.0中使用 @optional指令代替了非正式协议。
32、预处理指令:
#define 名称 值 (执行文本替换)
例子:#define IS_LEAP_YEAR(y) y % 400 == 0 || (y % 4 == 0 || \
y % 100 != 0)
33、NSInteger不是类,而是一个基本类型的typedef。
34、NSArray中只能存放对象而不能存放基本类型。
35、创建一个NSNumber类型的对象:NSNumber *numberInteger = [NSNumber numberWithInteger : 100];
36、有一个NSNumber得到一个NSInteger:NSInteger numbetInt = [numberInteger integerValue];
37、numberWithXXX:得到NSNumber对象(类方法)
initWithXXX:给NSNumber对象赋予初值(实例方法)
YYYValue:得到NSXXX类型数据(实例方法)
其中XXX有:Integer、UnsignedInteger、
Int、UnsignedInt、
Short、UnsignedShort、
LongLong、UnsignedLongLong、
Long、UnsignedLong、
Char、UnsignedCha、
Float、Double、Bool
YYY有:integer、unsignedInteger、
int、unsignedInt、
short、unsignedShort、
longlong、unsignedLong、
long、unsignedLong、
char、unsignedChar、
float、double、bool
38、[NSNumber对象 isEqualToNumber:NSNumber对象]:判断两个数值对象是否相等
39、[NSNumber对象 compare:NSNumber对象]:比较两个对象是大小,返回值类型是NSComparisonResult:
如果小于:NSOrderedAscending;
大于:NSOrderedDescending;
等于:NSOrderedSame;
40、常用的@"XXX"是NSConstantString的对象,这个类是NSString的子类:
NSConstantString *str = @"Hello World!!!";
NSLog(str);
[str release];
41、 %@: NSLog();函数中打印对象。
42、NSString以及NSConstantString都属于不可变字符串,而NSMutableString属于可变字符串。
43、[str1 stringByAppendingString : str2]:把str2追加到str1,并返回追加后的字符串
[str1 uppercaseString]:转换成大写并返回转换后的字符串,没有改变原来字符串的内容
[str1 lowercaseString]:转换成小写并返回转换后的字符串,没有改变原来字符串的内容
[NSString stringWithString : str1]:通过一个字符串返回一个字符串。
[str1 compare:str2]:比较两个字符串内容是否相等,区分大小写!
[str1 caseInsensitiveCompare : str2]:比较两个字符串是否相等,不区分大小写!
[str1 substringFromString : 3]:从第4个字符开始截取字符串到字符串末尾,并返回截取结果
[str1 substringToString : 7]:从第一个字符开始截取到第八个字符,并返回截取结果
[str3 substringWithRange : NSMakeRange(1,3)]:从第二个字符串开始截取3个字符串
44、NSRange数据结构:两个变量location和length
NSRange range = [str3 rangeOfString : @"Worl"];//如果没有截取到,则location=NSNotFound
NSLog(@"range.location:%i,range.length:%i",range.location,range.length);
45、NSMutableString
NSMutableString *ms;
ms = [NSMutableString stringWithString : str1];
[ms insertString:@" 'Huo Xing' " atIndex:5];
[ms insertString:@" 'Append in Last~~~~' " atIndex:[ms length]];
[ms appendString : @" append String "];
[ms deleteCharactersInRange : NSMakeRange(10,15)];
NSRange range = [ms rangeOfString : @"Hello "];
if(range.location != NSNotFound){
NSLog(@"range location:%i,length:%i",range.location,range.length );
}else{
NSLog(@"location not found!!!");
}
[ms setString:@"ZhongGuo"];
[ms replaceCharactersInRange : NSMakeRange(2,2) withString : @" Chinese "];
46、[ms replaceOccurrencesOfString:@"Chinese"
withString:@"China"
options:nil
range:NSMakeRange(0,[ms length])];
47、NSMutableArray是NSArray的子类,前者可变,后者不可变。
48、NSArray:
NSArray *array = [NSArray arrayWithObjects:@"First",@"Second",@"Third",@"Fourth",@"Fifth",nil];
for(int i = 0;i < 5;i++){
NSLog(@"%i : %@",(i + 1),[array objectAtIndex:i]);
}
49、MAC目录:
~ 用户主目录
. 当前目录
.. 上一级目录
50、文件操作:
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isRemoveSuc = [fileManager removeFileAtPath : @"D:\\demo01.txt" handler:nil];
if(isRemoveSuc){
NSLog(@"remove file at path is success");
}else{
NSLog(@"remove file at path is fail");
}
NSString *fileName = @"D:\\testfile.txt";
if([fileManager fileExistsAtPath : fileName] == NO){
NSLog(@"special file is not exists!!!");
}else{
NSLog(@"special file is exists!!!");
if([fileManager copyPath:fileName toPath : @"D:\\testfile02.txt" handler: nil] == YES){
NSLog(@"copyPath:toPath:handler: is success");
}else{
NSLog(@"copyPath:toPath:handler: is fail");
}
if([fileManager contentsEqualAtPath:fileName andPath:@"D:\\testfile02.txt"] == YES){
NSLog(@"testfile02.txt contents equal testfile01.txt");
}else{
NSLog(@"testfile02.txt contents not equal testfile01.txt");
}
if([fileManager contentsEqualAtPath:fileName andPath:@"D:\\testfile03.txt"] == YES){
NSLog(@"testfile03.txt contents equal testfile01.txt");
}else{
NSLog(@"testfile03.txt contents not equal testfile01.txt");
}
if([fileManager movePath : @"D:\\testfile02.txt" toPath:@"D:\\testfile04.txt" handler:nil] == YES){
NSLog(@"movePath:toPath: is success");
}else{
NSLog(@"movePath:toPath: is fail");
}
NSDictionary *attrs = [fileManager fileAttributesAtPath : fileName traverseLink:NO];
NSLog(@"file size is %i bytes!",[[attrs objectForKey : NSFileSize] intValue]);
/* NSString *contents = @"kd";
contents = [NSString initWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil];
NSLog(@"D:\\\\testfile.txt contents is : \n %@",contents);
*/