创建一个类的时候注意,凡是class method,在返回值前面需要加一个“+”号,
如果是instance method正好相反,在返回值前面加一个“-”号。
在同一个类的声明中,class method 可以跟instance method重名,另外method也可以与某个instance veriable重名,这种情况比较常见,往往用于获取这个instance veriable的值的方法中。
在声明返回值的时候可以用标准C 的语法将返回类型转换成需要的类型,比如
- (float)radius;
另外,如果这个method带有参数,且参数也需要转换类型的话,这往往是有必要的,因为不能保证调用参数的时候传入的参数类型就正好是相符的。比如
- (void)setRadius:(float)aRadius;
注意,在定义method的时候如果不显示的说明返回值或者传入参数的类型,那么缺省的类型就是id,
如果method有一堆参数的话,如此定义。
- makeGroup:group, ...;
- (void)setWidth:(float)width height:(float)height;
2009年3月2日星期一
Class Name的用途
在Objective-C中,Class Name有两种用途,第一是作为类型的说明,用来生成一个此Class的变量的声明。比如
Rectangle *anRect;
另外一种用途是用作Class Object,但是注意,用作Class object的时候一定是要放在一个message expression中,当作一个receiver来用的时候方才可以。比如
if ( [anObject isKindOfClass:[Rectangle class]] )
而不能写成
if ( [anObject isKindOfClass: Rectangle] )
Rectangle *anRect;
另外一种用途是用作Class Object,但是注意,用作Class object的时候一定是要放在一个message expression中,当作一个receiver来用的时候方才可以。比如
if ( [anObject isKindOfClass:[Rectangle class]] )
而不能写成
if ( [anObject isKindOfClass: Rectangle] )
2009年3月1日星期日
metaclass object
之前说到了Class object 它是compiler生成的,没有自己的instance variable,runtime system可以用它来生成instance。
除此之外compiler还会为每个类生成一个metaclass object,它使用来描述class object的,但是它只在内部被runtime system使用,用户是用不到它的。
Class Object的重要的作用就是生成instance,例如如下的代码
id myRect;
myRect = [Rectangle alloc];
这里Rectangle 是一个Class Object ,传给它一个alloc message然后返回的指针就赋给myRect了。便生成了一个instance myRect.
除此之外compiler还会为每个类生成一个metaclass object,它使用来描述class object的,但是它只在内部被runtime system使用,用户是用不到它的。
Class Object的重要的作用就是生成instance,例如如下的代码
id myRect;
myRect = [Rectangle alloc];
这里Rectangle 是一个Class Object ,传给它一个alloc message然后返回的指针就赋给myRect了。便生成了一个instance myRect.
Class Method 和 instance Method
Objective -C 中,编译器将Class 代码编译生成一个Class Object这个,它不能使用instance method, 但它也有自己的继承,就是它可以从父类那里继承来一些class method, 比如version.
举一个例子,
int versionNumber = [Rectangle version];
除了这样你还可以这样
id aClass = [anObject class];
id rectClass = [Rectangle class];
因为Class Object和其他任何object一样都能被定义成id类型,因为他们都是Object,同样的任何Class Object都是属于Class这个类,所以我们同样可以type成Class.
这是两种获知id指针的方式,即可以向一个instance 传一个class消息,也可以向一个class object也就是用Rectangle来代表的这个传一个message消息,都能获知id
Class aClass = [anObject class];
Class rectClass = [Rectangle class];
举一个例子,
int versionNumber = [Rectangle version];
除了这样你还可以这样
id aClass = [anObject class];
id rectClass = [Rectangle class];
因为Class Object和其他任何object一样都能被定义成id类型,因为他们都是Object,同样的任何Class Object都是属于Class这个类,所以我们同样可以type成Class.
这是两种获知id指针的方式,即可以向一个instance 传一个class消息,也可以向一个class object也就是用Rectangle来代表的这个传一个message消息,都能获知id
Class aClass = [anObject class];
Class rectClass = [Rectangle class];
Static typing
Objective-C中如果申明了类,然后定制这个对象的话,叫做static typing. 与其相对的是用id来动态的声明一个对象,将来在使用的时候可以将它弄成任意的类。
static typing的好处很多,但是不能取代dynamic binding 和 dynamic determination of a receiver's class.
任何一种对象,都可以用它所属类的父类来声明,编译的时候没所谓,runtime的时候会找出来它真正属于的类。NSObject中间还有两个方法用于揭示一个对象究竟属于那个类,他们分别是isMemberOfClass 和 isKindOfClass,这两个方法传入的参数都是someClass ,返回值是一个bool值,其中isMemberOfClass 是用以判断这个Object是不是后面那个传入的类的实例,另外一个方法isKindOfClass是用于判断这个Object 是不是后面那个传入类的实例又或者是是它父类的实例。总之是要判断这个Object是否在后面传入这个类的继承树上。
另外Objective-C中的abstract Class 与其他语言的中的规定有所不同,它没有专门标注这种抽象类的说明符号,也并不禁止从抽象类生成实例,但是因为抽象类中的很多方法并没有完成,所以即便是生成了抽象类的实例大多数情况下也没什么用处,不过也有例外,就是NSView这个类,经常被直接的使用,而另外一个经典的例子就是NSObject如果你生成一个这样的实例将什么也做不了。
static typing的好处很多,但是不能取代dynamic binding 和 dynamic determination of a receiver's class.
任何一种对象,都可以用它所属类的父类来声明,编译的时候没所谓,runtime的时候会找出来它真正属于的类。NSObject中间还有两个方法用于揭示一个对象究竟属于那个类,他们分别是isMemberOfClass 和 isKindOfClass,这两个方法传入的参数都是someClass ,返回值是一个bool值,其中isMemberOfClass 是用以判断这个Object是不是后面那个传入的类的实例,另外一个方法isKindOfClass是用于判断这个Object 是不是后面那个传入类的实例又或者是是它父类的实例。总之是要判断这个Object是否在后面传入这个类的继承树上。
另外Objective-C中的abstract Class 与其他语言的中的规定有所不同,它没有专门标注这种抽象类的说明符号,也并不禁止从抽象类生成实例,但是因为抽象类中的很多方法并没有完成,所以即便是生成了抽象类的实例大多数情况下也没什么用处,不过也有例外,就是NSView这个类,经常被直接的使用,而另外一个经典的例子就是NSObject如果你生成一个这样的实例将什么也做不了。
2009年2月9日星期一
MVC概念以及iphone开发中的属性
Model : 用于保存程序数据的类
View : 所有的用户能看到的诸如窗体之类,还有用户能用来操作的控件
Controller: 程序逻辑,用于连接 model和view的部分,知道如何处理用户的输入,如何来响应事件.
Controller 里面的类可以通过一个特殊的变量实例outlet来引用nib里的对象,这个实例就如同一个指针指向了nib中的对象. Controller里面要操作一个nib里的对象的时候可以先声明一个outlet然后将这个outlet指向想要操作的对象,然后通过这个outlet就可以操作指向的对象了.
从操作的另外一个方向来讲,也可以在nib文件中创建接口对象,用以激发在controller中的特别处理,这类处理就称之为动作action,加入当手指离开一个按钮的时候,这本身就是一个事件,这个事件发生的时候你的controller里面的一个method就可能被触发.
(IBAction)dosomething:(id)sender 这是action方法的声明方式,注意,后面的sender是可选的,即便你声明的时候有这个sender,使用的时候也完全可以不带.
在定义一个property的时候,在"property"关键字后面带的括号中的可选属性,如果property操作的对像是一个raw type(基本类型) 比如int则不需要带retain关键字,如果操作的对像是用户构建的其他的非简单类型,则必须要带这个attribute不然就有可能在你还需要操作这个对象的时候它就已经被从内存中清除了.
到这一步一个属性的开头应该是 @property (retain,) 当然后面还有别的东西,慢慢讲. 另外一个attribute是nonatomic,其实为了实现多线程的应用,还可以选别的,但是那样会增加不必要的开销,尽管开销不大,还是应该避免,大多数情况下,这里要用nonatomic,后面其实还会看到不用nonatomic的情况.
View : 所有的用户能看到的诸如窗体之类,还有用户能用来操作的控件
Controller: 程序逻辑,用于连接 model和view的部分,知道如何处理用户的输入,如何来响应事件.
Controller 里面的类可以通过一个特殊的变量实例outlet来引用nib里的对象,这个实例就如同一个指针指向了nib中的对象. Controller里面要操作一个nib里的对象的时候可以先声明一个outlet然后将这个outlet指向想要操作的对象,然后通过这个outlet就可以操作指向的对象了.
从操作的另外一个方向来讲,也可以在nib文件中创建接口对象,用以激发在controller中的特别处理,这类处理就称之为动作action,加入当手指离开一个按钮的时候,这本身就是一个事件,这个事件发生的时候你的controller里面的一个method就可能被触发.
(IBAction)dosomething:(id)sender 这是action方法的声明方式,注意,后面的sender是可选的,即便你声明的时候有这个sender,使用的时候也完全可以不带.
在定义一个property的时候,在"property"关键字后面带的括号中的可选属性,如果property操作的对像是一个raw type(基本类型) 比如int则不需要带retain关键字,如果操作的对像是用户构建的其他的非简单类型,则必须要带这个attribute不然就有可能在你还需要操作这个对象的时候它就已经被从内存中清除了.
到这一步一个属性的开头应该是 @property (retain,) 当然后面还有别的东西,慢慢讲. 另外一个attribute是nonatomic,其实为了实现多线程的应用,还可以选别的,但是那样会增加不必要的开销,尽管开销不大,还是应该避免,大多数情况下,这里要用nonatomic,后面其实还会看到不用nonatomic的情况.
订阅:
评论 (Atom)