ios objective c 的基本知识

本文深入探讨了Objective-C的基本概念、语法结构、类与对象的使用,以及如何利用其强大的消息传递机制进行高效编程。重点介绍了NSCalendarDate类的使用、初始化方法、属性操作,同时阐述了初始化规范和消息机制的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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可以很容易给正在运行的程序添加类和方法。这是一种非常强大的技术,用来创建可以让其他开发者扩展的程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值