i) #import<Foundation/Foundation.h>包含了Foundation框架中所有类的头文件。
ii) 在printf函数中,符号%x可以显示十六进制格式的整型数。而对于NSLog函数,同样支持printf函数所有的格式和控制符号。而且它还可以支 持%@来打印一个对象。当使用%@时,给对象发送description消息,description方法返回一个字符串来代替%@。
符号 显示
%@ id
%d,%D,%i long
%u,%U unsigned long
%hi short
%hu unsigned short
%qi long long
%qu unsigned long long
%x,%X 16进制打印unsigned long
%o,%O 8进制打印 unsigned long
%f,%e,%E,%g,%G double
%c unsigned char-ASCII 字符
%C unichar-Unicode 字符
%s char* (以空字符结束的ASCII字符组成的字符串)
%S unichar* (以空字符结束的Unicode字符组成的字符串)
%p void* (以0x开头的16进制的地址空间)
%% A%字符
iii) 在开发阶段,你应该使用Debug设定。而要发布你的程序时,应使用Release设定。Release设定会创建通用二进制程序,并且去掉了Debug所需的信息。所以,相对于Debug,Release设置大概需要2倍的时间来编译项目。
iv)NSObject
-(id)init 在分配内存空间后对对象进行初始化。
-(NSString*)description 返回一个NSString对象来描述接收者。
-(BOOL)isEqual:(id)anObject 当接收者和anObject相等时返回YES,否则返回NO。
v) NSArray
你不能把nil添加到NSArray中。NSArray在创建的时候,包含了所有对象,不能添加或删除其中任何一个对象。
-(unsigned)count 返回array中的对象个数。
-(id) objectAtIndex:(unsigned)i 返回索引为i的对象。如果i值超过了array的对象数量,程序运行到这里就会产生错误。
-(id) lastObject 返回array中最后一个对象。如果array中没有任何对象存在,返回nil。
-(BOOL)containsObject:(id)anObject 如果序列中“出现”了anObject,则返回YES。对于“出现”的定义是这样的:array调用对象的isEqual:方法,并把anObject当 成参数。如果isEqual:返回YES,那么说明anObject“出现”在序列中。
-(unsigned)indexOfObject:(id)anObject 在array中查找是否存在和anObject对象相等的对象,并返回所找到的最小索引值对象的索引。调用对象的isEqual:方法作为比较函数。如果没有找到则会返回NSNotFound。
vi) NSMutableArray
NSMutableArray继承至NSArray,扩展了增加、删除对象的功能,可以使用NSArray的mutableCopy方法来复制得到一个可修改的NSMutableArray对象。
-(void)addObject:(id)anObject 在接收者的最后插入anObject。不容许给序列添加nil。
-(void) addObjectsFromArray:(NSArray *)otherArray 在array的最后,把otherArray中的对象都依次添加进去。
-(void) insertObject:(id)anObject atIndex:(unsigned)index 在索引index处插入anObject。如果index被占用,会把index索引之后的对象向后移动,腾出一个空间。index不能大于所包含对象个数,并且anObject不能为空,否则将会报错。
-(void) removeAllObjects 清空array中所有成员。
-(void) removeObject:(id)anObject 删除所有和anObject相等的对象。同样使用isEqual:作为相等比较方法。
-(void) removeObjectAtIndex:(unsigned)index 删除索引为index的对象,后面的对象依次往前移。如果index越界,将会报错。
想给array加一个空的对象,可以通过使用NSNull来做这件事。
vii) NSString
一个NSString对象可以存储Uncode字符。
-(id)initWithFormat:(NSSting *)format,...
-(unsigned int)length 返回字符个数。
- (NSString *)stringByAppendingString:(NSString *)aString 给一个字符串附加一个字符串aString,并返回该字符串。
viii) Cocoa新手程序员经常喜欢创建NSSring、NSMutableArray的子类。一般不这么做,让一个较大的对象来包含NSSring或NSMutableArray,这叫做composition。
ix) Objective-C 基本编程思想是:在大多数情况下,选择“有一个”,而不是“是一个”。
x) 容许其他对象访问变量,设计一对设置和返回该变量的方法,我们称之为accesor方法。
3.3 建立自己的类
i) NSCalendarDate
NSCalendarDate对象包含了日期、时间、时区以及一个带有格式的字符串。NSCalederDate从NSDate继承而来。
NSCalendarDate对象基本上是不能被修改的:你无法修改其中的时间和日期。当然你可以修改那个带格式的字符串和时区。
NSCalenderDate对象经常被多个对象共享使用。
+(id)calendarDate 该方法创建并返回了一个本地日期和时间的默认格式的NSCalendarDate对象,它的时区为机器所设置。
+号表示类方法,通过给类而不是对象发送消息来调用。
+(id)dateWithYear:(int)year
month:(unsigned)month
day:(unsigned)day
hour:(unsigned)hour
minute:(unsigned)minute
second:(unsigned)second
timeZone:(NSTimeZone *)aTimeZone
类方法返回一个自动释放对象。
-(NSCalendarDate *)dateByAddingYears:(int)year
months:(int)month
days:(int)day
hours:(int)hour
minutes:(int)minute
seconds:(int)second
这个方法返回和参数指定的 年、月、日、小时、分、秒偏移量的日历对象。
-(int)dayOfCommonEra 这个方法返回从1 A.D到现在的天数。
-(int)dayOfMonth 这个方法返回的是这个月的第几天(1到31)。
-(int)dayOfWeek 这个方法返回一周中的星期几(0到6),0代表星期天。
-(int)dayOfYear 这个方法返回一年中的第几天(1-366)。
-(int)hourOfDay 这个方法返回接收时的小时值(0到23)。
-(int)minuteOfHour 这个方法返回接收时的分钟值(0到59)。
-(int)monthOfYear 这个方法返回一年中的第几个月(1到12)。
-(void)setCalendarFormat:(NSString *)format 这个方法设置接收者的默认的日历格式。日历格式是由一个包含日期转换说明的字符串。
符号 意义
%y 不带公元纪年的年份(00-99)
%Y 带公元纪年的年份(“1990”)
%b 月份的缩写(”Jan“)
%B 月份的全称(”January“)
%m 以数字显示的月份(01-12)
%a 星期几的缩写(”Fri“)
%A 星期几的全称(”Friday“)
%w 以数字显示的星期几(0-6),0为星期天
%d 一月中的第几天(01-31)
%e 和%d一样,只是没有前面的0
%j 一年中的第几天(001-366)
%H 以24小时计量的小时数(00-23)
%I 以12小时计量的小时数(01-12)
%p 本地的A.M./P.M.
%M 分钟数(00-59)
%S 秒数(00-59)
%F 毫秒数(000-999)
%x 本地的日期表示的天
%X 本地的时间表示的时间
%c %X%x的简短格式,时间和日期的本地格式
%Z 时区名字
%z 小时和分计量的时区和GMT的差值(HHMM)
%% A%字符
-(NSDate *)laterDate:(NSDate *)anotherDate 这个方法继承至NSDate。将接受者和anotherDate做比较,返回两者中日期靠后的那一个。
-(NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate 这个方法计算接收时与anotherDate之间以秒计量的时间差。如果接收时早于anotherDate,返回值为负数。 NSTimerInterval就是double类型。
ii)创建initializer的规范
?如果父类的initializer够用,不要去创建自己的initializer。
?如果要创建自己的initializer,一定要重载父类的designated initalizer。
?如果要创建了多个initializer,让其中一个做真正的初始化工作-designated initializer,其他的都调用它。
?你的designated initializer将要调用父类的designated initializer。
3.5 消息机制工作原理是什么
在之前提到过,类就像一个C结构体。NSObject声明了一个成员变量叫isa。因为NSObject是整个类继承树的根类,所以所有的对象都会有一个 isa指针,指向创建对象的类结构。而该isa变量指向该对象的类。类结构中包含了类定义的成员变量的名字和类型,以及实现了哪些方法。还包含了一个方法 以selector索引,selector的数据类型是SEL。虽然SEL定义成char*,可是把它想象成int会更好理解。每个方法的名字对应一个唯 一的int值。例如,方法addObject:对应的可能是数字12。当寻找这个方法时,使用的是selector,而不是字符串 @“addObject:”。
作为Objecttive-C数据结构中的一部分,有一个表用来在名字和selector间映射。在编译的时候,只要有方法的调用,编译器都会通过selector来查找方法,所以
[myObject addObject:yourObject];
变成了(假设addObject的selector为12)
objc_msgSend(myObject,12,yourObject);
在这里,objc_msgSend()函数将使用myObject‘s 的isa类指针来找到它的类结构并在类结构中查找12所对应的方法。如果没有找到,那么将使用指向父类的指针在父类结构中进行selector为12的查 找。如果父类中也没有对应的方法,就继续往父类的父类中查找,直到找到为止。如果最后在根类中仍然找不到,将会抛出一个异常。
很显然,这是一个很动态的消息处理方法。类结构可以在运行的时候被改变。特别要提到的是,使用类NSBundle可以很容易给正在运行的程序添加类和方法。这是一种非常强大的技术,用来创建可以让其他开发者扩展的程序。
ii) 在printf函数中,符号%x可以显示十六进制格式的整型数。而对于NSLog函数,同样支持printf函数所有的格式和控制符号。而且它还可以支 持%@来打印一个对象。当使用%@时,给对象发送description消息,description方法返回一个字符串来代替%@。
符号 显示
%@ id
%d,%D,%i long
%u,%U unsigned long
%hi short
%hu unsigned short
%qi long long
%qu unsigned long long
%x,%X 16进制打印unsigned long
%o,%O 8进制打印 unsigned long
%f,%e,%E,%g,%G double
%c unsigned char-ASCII 字符
%C unichar-Unicode 字符
%s char* (以空字符结束的ASCII字符组成的字符串)
%S unichar* (以空字符结束的Unicode字符组成的字符串)
%p void* (以0x开头的16进制的地址空间)
%% A%字符
iii) 在开发阶段,你应该使用Debug设定。而要发布你的程序时,应使用Release设定。Release设定会创建通用二进制程序,并且去掉了Debug所需的信息。所以,相对于Debug,Release设置大概需要2倍的时间来编译项目。
iv)NSObject
-(id)init 在分配内存空间后对对象进行初始化。
-(NSString*)description 返回一个NSString对象来描述接收者。
-(BOOL)isEqual:(id)anObject 当接收者和anObject相等时返回YES,否则返回NO。
v) NSArray
你不能把nil添加到NSArray中。NSArray在创建的时候,包含了所有对象,不能添加或删除其中任何一个对象。
-(unsigned)count 返回array中的对象个数。
-(id) objectAtIndex:(unsigned)i 返回索引为i的对象。如果i值超过了array的对象数量,程序运行到这里就会产生错误。
-(id) lastObject 返回array中最后一个对象。如果array中没有任何对象存在,返回nil。
-(BOOL)containsObject:(id)anObject 如果序列中“出现”了anObject,则返回YES。对于“出现”的定义是这样的:array调用对象的isEqual:方法,并把anObject当 成参数。如果isEqual:返回YES,那么说明anObject“出现”在序列中。
-(unsigned)indexOfObject:(id)anObject 在array中查找是否存在和anObject对象相等的对象,并返回所找到的最小索引值对象的索引。调用对象的isEqual:方法作为比较函数。如果没有找到则会返回NSNotFound。
vi) NSMutableArray
NSMutableArray继承至NSArray,扩展了增加、删除对象的功能,可以使用NSArray的mutableCopy方法来复制得到一个可修改的NSMutableArray对象。
-(void)addObject:(id)anObject 在接收者的最后插入anObject。不容许给序列添加nil。
-(void) addObjectsFromArray:(NSArray *)otherArray 在array的最后,把otherArray中的对象都依次添加进去。
-(void) insertObject:(id)anObject atIndex:(unsigned)index 在索引index处插入anObject。如果index被占用,会把index索引之后的对象向后移动,腾出一个空间。index不能大于所包含对象个数,并且anObject不能为空,否则将会报错。
-(void) removeAllObjects 清空array中所有成员。
-(void) removeObject:(id)anObject 删除所有和anObject相等的对象。同样使用isEqual:作为相等比较方法。
-(void) removeObjectAtIndex:(unsigned)index 删除索引为index的对象,后面的对象依次往前移。如果index越界,将会报错。
想给array加一个空的对象,可以通过使用NSNull来做这件事。
vii) NSString
一个NSString对象可以存储Uncode字符。
-(id)initWithFormat:(NSSting *)format,...
-(unsigned int)length 返回字符个数。
- (NSString *)stringByAppendingString:(NSString *)aString 给一个字符串附加一个字符串aString,并返回该字符串。
viii) Cocoa新手程序员经常喜欢创建NSSring、NSMutableArray的子类。一般不这么做,让一个较大的对象来包含NSSring或NSMutableArray,这叫做composition。
ix) Objective-C 基本编程思想是:在大多数情况下,选择“有一个”,而不是“是一个”。
x) 容许其他对象访问变量,设计一对设置和返回该变量的方法,我们称之为accesor方法。
3.3 建立自己的类
i) NSCalendarDate
NSCalendarDate对象包含了日期、时间、时区以及一个带有格式的字符串。NSCalederDate从NSDate继承而来。
NSCalendarDate对象基本上是不能被修改的:你无法修改其中的时间和日期。当然你可以修改那个带格式的字符串和时区。
NSCalenderDate对象经常被多个对象共享使用。
+(id)calendarDate 该方法创建并返回了一个本地日期和时间的默认格式的NSCalendarDate对象,它的时区为机器所设置。
+号表示类方法,通过给类而不是对象发送消息来调用。
+(id)dateWithYear:(int)year
month:(unsigned)month
day:(unsigned)day
hour:(unsigned)hour
minute:(unsigned)minute
second:(unsigned)second
timeZone:(NSTimeZone *)aTimeZone
类方法返回一个自动释放对象。
-(NSCalendarDate *)dateByAddingYears:(int)year
months:(int)month
days:(int)day
hours:(int)hour
minutes:(int)minute
seconds:(int)second
这个方法返回和参数指定的 年、月、日、小时、分、秒偏移量的日历对象。
-(int)dayOfCommonEra 这个方法返回从1 A.D到现在的天数。
-(int)dayOfMonth 这个方法返回的是这个月的第几天(1到31)。
-(int)dayOfWeek 这个方法返回一周中的星期几(0到6),0代表星期天。
-(int)dayOfYear 这个方法返回一年中的第几天(1-366)。
-(int)hourOfDay 这个方法返回接收时的小时值(0到23)。
-(int)minuteOfHour 这个方法返回接收时的分钟值(0到59)。
-(int)monthOfYear 这个方法返回一年中的第几个月(1到12)。
-(void)setCalendarFormat:(NSString *)format 这个方法设置接收者的默认的日历格式。日历格式是由一个包含日期转换说明的字符串。
符号 意义
%y 不带公元纪年的年份(00-99)
%Y 带公元纪年的年份(“1990”)
%b 月份的缩写(”Jan“)
%B 月份的全称(”January“)
%m 以数字显示的月份(01-12)
%a 星期几的缩写(”Fri“)
%A 星期几的全称(”Friday“)
%w 以数字显示的星期几(0-6),0为星期天
%d 一月中的第几天(01-31)
%e 和%d一样,只是没有前面的0
%j 一年中的第几天(001-366)
%H 以24小时计量的小时数(00-23)
%I 以12小时计量的小时数(01-12)
%p 本地的A.M./P.M.
%M 分钟数(00-59)
%S 秒数(00-59)
%F 毫秒数(000-999)
%x 本地的日期表示的天
%X 本地的时间表示的时间
%c %X%x的简短格式,时间和日期的本地格式
%Z 时区名字
%z 小时和分计量的时区和GMT的差值(HHMM)
%% A%字符
-(NSDate *)laterDate:(NSDate *)anotherDate 这个方法继承至NSDate。将接受者和anotherDate做比较,返回两者中日期靠后的那一个。
-(NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate 这个方法计算接收时与anotherDate之间以秒计量的时间差。如果接收时早于anotherDate,返回值为负数。 NSTimerInterval就是double类型。
ii)创建initializer的规范
?如果父类的initializer够用,不要去创建自己的initializer。
?如果要创建自己的initializer,一定要重载父类的designated initalizer。
?如果要创建了多个initializer,让其中一个做真正的初始化工作-designated initializer,其他的都调用它。
?你的designated initializer将要调用父类的designated initializer。
3.5 消息机制工作原理是什么
在之前提到过,类就像一个C结构体。NSObject声明了一个成员变量叫isa。因为NSObject是整个类继承树的根类,所以所有的对象都会有一个 isa指针,指向创建对象的类结构。而该isa变量指向该对象的类。类结构中包含了类定义的成员变量的名字和类型,以及实现了哪些方法。还包含了一个方法 以selector索引,selector的数据类型是SEL。虽然SEL定义成char*,可是把它想象成int会更好理解。每个方法的名字对应一个唯 一的int值。例如,方法addObject:对应的可能是数字12。当寻找这个方法时,使用的是selector,而不是字符串 @“addObject:”。
作为Objecttive-C数据结构中的一部分,有一个表用来在名字和selector间映射。在编译的时候,只要有方法的调用,编译器都会通过selector来查找方法,所以
[myObject addObject:yourObject];
变成了(假设addObject的selector为12)
objc_msgSend(myObject,12,yourObject);
在这里,objc_msgSend()函数将使用myObject‘s 的isa类指针来找到它的类结构并在类结构中查找12所对应的方法。如果没有找到,那么将使用指向父类的指针在父类结构中进行selector为12的查 找。如果父类中也没有对应的方法,就继续往父类的父类中查找,直到找到为止。如果最后在根类中仍然找不到,将会抛出一个异常。
很显然,这是一个很动态的消息处理方法。类结构可以在运行的时候被改变。特别要提到的是,使用类NSBundle可以很容易给正在运行的程序添加类和方法。这是一种非常强大的技术,用来创建可以让其他开发者扩展的程序。