O-C和C的差别以及其自身的特点

来源:互联网 发布:nginx 80端口被占用 编辑:程序博客网 时间:2024/05/21 11:28

Objective-C中有几种数据类型和C不太一样:

  • - id 是一个指针类型,可以指向任何类型的对象
  • - BOOL和char是一样的,但是做为布尔值使用。
  • YES 表示1
    NO 表示0

  • - IBOutlet 是个没有任何意义的宏,可以忽略。当InterfaceBuilder从.h文件中读取类定义时,这个宏会对其做出一个提示。
  • - IBAction和void是一样的,同样仅用作对Interface Builder的提示。
  • - nil和NULL是一样的,我们使用nil而不用NULL是因为我们用来表示对象的指针为空。

另外
#import和#include是一样的,但是#import可以确保引用的文件只被引用一次。

tags: IOS, iPhone, Objective-C
posted in IOS by ice.deng | No Comments

Objective-C特点

四月 18, 2011
  1. 目前好象只有Apple使用Objective-C作为其支持的语言吧。
  2. 与C++的不同之处有:
    • O-C中所有的类都必须继承自NSObject。
    • O-C中所有对象都是指针的形式。
    • O-C用self代替this。
    • O-C使用id代替void*。
    • O-C使用nil表示NULL
    • O-Ck只支持单继承。
    • O-C使用YES/NO表示TRUE/FALSE
    • O-C使用#import代替#include
    • O-C中用消息表示类的方法,并采用[aInstance method:argv]调用形式。
    • O-C支持反射机制
    • O-C支持Dynamic Typing, Dynamic Binding和Dynamic Loading。
  3. 与C++的相同之处有:
    • 与C共享的部分一致。
    • 可以使用assert(BOOL), 一般用NSCParameterAssert(BOOL)代替。
  4. O-C中的命名前缀说明:
    • NS-:NextStep
    • CF-:Core Foundation
    • CA-:Core Animation
    • CG-:Core Graphics
    • UI-:User Interface
  5. O-C中的消息特殊性:
    • 调用消息的类可以不知道如何响应这个消息。如果它不知道如何处理这个消息,它会自动的将这个消息转给其他的类,比如它的父类。
    • 调用消息的类可以是nil。在C++中,在使用类方法之前,我们都需要检查对象是否为空,所以在实现析构函数的时候,常会有如下的代码,如if(var) { delete var; } 但是在objective c中,我们就可以直接写[varrelease]; 即使var == nil, 也不会有问题。
  6. O-C中的函数声明格式有:
    • -/+ (return type) function_name;
    • -/+ (return type) function_name : (parameter type)parameter;
    • -/+ (return type) function_name : (parameter type)parameter1 otherParameter :(parameter_type) parameter2
    • 以上参数说明:-表示一般函数,+表示静态函数。otherParameter是参数的别名(第一个参数的别名省略),在函数调用时方便指定。
  7. O-C中的构造/析构函数
    • O-C中的init()/release()对应于C++的构造/析构函数。alloc()/dealloc()也就对应于C++的new和delete,其中的dealloc()由于引用计数的自动调用而不用手动调用。
    • O-C中父类的init()/release()函数需要子类的手动调用。而且每次都必须调用。不同于C++的自动调用。
    • 构造函数(- (id) init)调用形如:CSample* pSample=[CSample alloc]init];其中alloc(+ (id)alloc)是继承来的static函数,init是继承来的一般函数,如重写一般函数时,则相当于C++的覆盖(不带参数)或重载(带参数)。
    • 析构函数(- (void) release)将引用计数减1,当=0时父类的release()会自动调用dealloc(-(void) dealloc);
  8. 当O-C没有数据成员时,可省略{},建议保留。
  9. 继承下来的方法,如:-(id) init可以头文件中省略,建议保留
  10. 0-C中只有数据成员的访问限制,没有方法的访问限制。
    • 同C++一样,数据成员有三种访问限制public, protected,private,缺省是protected。
      示例:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      @interface AccessExample: NSObject {
      @public
          intpublicVar;
      @protected
          intprotectedVar;
      @private
          intprivateVar;
      }
      @end
    • 方法的访问限制可通过Category实现
      示例:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      @interface MyClass
      -(void) sayHello {
          NSLog(@"Hello");
      }
      @end
       
      @interface MyClass(Private)
      -(void) kissGoodbye;
      @end
  11. O-C中没有类的静态变量,只有全局变量
  12. O-C中的数组NSArray可以保存不同类型的数据。
  13. O-C也支持run-time时的类类型检查
    • - (BOOL) isKindOfClass: classObj
      用于判断该对象是否属于某个类或者它的子类
    • - (BOOL) isMemberOfClass: classObj
      用于判断该对象是否属于某个类(这里不包括子类)
    • - (BOOL) respondsToSelector: selector
      用于判断该对象是否能响应某个消息。这里,我们可以将@selector后面带的参数理解为C++中的函数指针。
      注意:
      1)不要忘了@
      2)@selector后面用的是(),而不是[]。
      3)要在消息名称后面跟:,无论这个消息是否带参数。如:[pSquarerespondsToSelector:@selector(Set: andHeight:)]。
    • + (BOOL) instancesRespondToSelector: selector
      用于判断该类是否能响应某个消息。这是一个静态函数。
    • -(id) performSelector: selector :调用对象的selector方法。
    • conformsToProtocol 类似于respondsToSelector,用于动态检查某个对象是否遵守某个协议。
  14. Category:在没有源代码的情况下,为一个已经存在的类添加一些新的功能
    • 只能添加新的方法,不能添加新的数据成员
    • Category 的名字必须是唯一的
  15. Protocol:相当于C++中的纯虚类
    • 形如:@interface MyDate: NSObject<Printing> { } @end
    • 使用:MyDate * dat = [[MyDate alloc] init];id<Printing> var = dat; [varprint]。
    • 说明:我们首先声明了Printing 协议,任何遵守这个协议的类,都必须实现print 方法。在Objective C中,我们通过<>来表示遵守某个协议。当某个类声明要遵守某个协议之后,它就必须在.m文件中实现这个协议中的所有方法。使用id<Printing> 作为类型,而不是象C++中的Printing*var。
  16. IBOutlet, IBAction: 这两个东西其实在语法中没有太大的作用。如果你希望在InterfaceBuilder中能看到这个控件对象,那么在定义的时候前面加上IBOutlet,在IB里就能看到这个对象的outlet,如果你希望在Interface Builder里控制某个对象执行某些动作,就在方法前面加上(IBAction)。
  17. 尽量避免在一行语句中进行两层以上的嵌套
  18. 消息转发:- (void) forwardInvocation:(NSInvocation*)anInvocation;

tags: IOS, iPhone, Objective-C
posted in IOS by ice.deng | No Comments

Mac/iPhoneCategory & Protocol

四月 18, 2011

http://blog.codingmylife.com/?p=41

Categories

1
2
3
4
5
6
7
8
#import “ClassName.h”
@interface ClassName ( CategoryName )
//method declarations
@end
#import “ClassName+CategoryName.h”
@implementation ClassName ( CategoryName)
//method definitions
@end

For example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@interface MyObject : NSObject{
NSNumber *number;
}
-(NSNumber *)number;
@end
@interface MyObject (Setter)
-(void)setNumber:(NSNumber *)newNumber;
@end
@implementation MyObject
-(NSNumber *)number{
return number;
}
-(void)setNumber(NSNumber *)newNumber{
number = newNumber;
}
@end

Protocol

1
2
3
4
5
6
7
8
@protocol MyProtocol
-(void)requiredMethod;
@optional
-(void)anOptionalMethod;
-(void)anotherOptionalMethod;
@required
-(void)anotherRequiredMethod;
@end

For example

1
2
3
4
5
6
7
8
9
10
Inherit multiple protocol. @interface Formatter :NSObject Instance. Protocol *myXMLSupportProtocol =@protocol(MyXMLSupport);
Check if methods are declared
if(![receiverconformsToProtocol:@protocol(MyXMLSupport)]){
//Object does not conform to MyXMLSupportprotocol
//If you are expecting receiver to implement methodsdeclared in the
//MyXMLSupport protocol, this is probably anerror
}
 
-(NSString*)formattingService:(id)anObject;
———————————————————————

http://icocoa.cn/ocsection/oc-tips/60-category-vs-protocol

Category
Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,我们可以为任何已经存在的class添加方法(不包括数据成员)却不需要访问该class的实现文件。
新添加的方法和原有的方法具有同等的地位,可以访问class的数据成员,并且完全植入到class的继承体系之中,子类同样会继承新添加的方法。利用category对类进行扩展可以避免使类的继承体系过于臃肿,复杂,降低了维护成本。另外,新添加的方法如果和已经存在的方法具有相同的prototype,那么新添加的方法将会覆盖已经存在的方法,也就是category使得使得在没有源文件时修改已存在class的functionality或者清除bug成为可能,所有该class的对象的行为都将发生变化,这一点是继承无法达到的。

Category的缺点:
如果一个已经存在的方法被新方法覆盖,那么将没有任何途径可以对旧方法进行调用。这一点和继承是不同的,子类对父类成员函数重写(override),但我们依然可以对父类中的被重写的成员函数进行调用。
如果有多个category对同一个class的成员函数进行重写,那么具体的行为是未定义。
Category的应用:
对类进行扩展或patch。
使用category或(anonymous category)来模拟实现private method。
使用category(informal protocol)来实现delegation,在cocoaframework中就大量使用了category来声明delegate methods。
利用category把一个庞大的class划分为小块儿来分别进行开发,从而将functionality更好的进行划分,利于维护。


原创粉丝点击