objective-c 基础入门介绍

来源:互联网 发布:python .copy 编辑:程序博客网 时间:2024/05/20 07:50

#import <Foundation/Foundation.h>
 
   int main(int argc, char *argv[]){
    @autoreleasepool{
        NSLog(@"Hello World!");
    }
  return 0;
}


 c++ 中类与方法在编译的时期就已经确定
 objecTive——v  类->讯息 :运行时期确定,如果没有抛出exception
 
 比如:[obj method: argument]; ===》[car fly];
 
 优缺点:C++ 支持多继承,函数调用非常的快,编译时期确定了,缺点不支持动态绑定
         objective-c允许传送任何数据给类,不需要一一检查类型,传nil不会崩溃

   
   
Interface接口区段里头清楚定义了类的名称,私有变量(instance variable),以及方法。 以关键字@interface作为区段起头,@end结束区段。

@interface MyObject : NSObject {
    int memberVar1; // 私有变量
    id  memberVar2;
}
+(return_type) class_method;            // 类方法
 
-(return_type) instance_method1;        // 实例方法
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end
方法前面的+/-号代表方法的类型:加号(+)代表类方法(classmethod),不需要实例对象就可以呼叫,近于C++的静态成员函数(static member function)。减号(-)即是一般的实例方法(instance method)。

参数传递
    objective-c 用(:)来进行参数的传递,  优点: 使参数没有必要复数于方法调用的末尾,
提高了代码的可读性:
  比如: 
  - (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 宣告方法 */
 
   [myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 呼叫方法 */
    这个方法的全名是setColorToRed:Green:Blue:。每个冒号后面都带着一个形态为float的参数,分别代表红,绿,蓝三色。
 
 
Implementation实现区段则撰写方法的实际运行代码。
以关键字@implementation作为区段起头,@end结尾。

@implementation MyObject
 
+(return_type) class_method {
 .... //method implementation
}
-(return_type) instance_method1 {
  ....
}
-(return_type) instance_method2: (int) p1 {
 ....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
 ....
}
@end

创建对象 
    Objective-C建立物件需透过两个讯息:alloc以及init。alloc的作用是分派内存空间,init则是对物件做初始化。 init与alloc都是定义在NSObject里的类方法,当物件收到这两个讯息并做出正确回应后,新实体才算准备妥当。以下即为范例
 MyObject *my = [[MyObject alloc] init]  // 1.0 
 2.0 
 MyObject *my = [MyObject new]
    // 自定义初始化可以 复写init方法。 来添加额外的工作(类似构造方法)
 -(id) init{
  if ( self = [super init] ){ // 必须呼叫父类的方法
  //do someting here....
  }
  return self;
 }
 (note: java 中接口必须实现中的所有方法, o——c中2.0 后可以选择性的实现)
 

 
动态类型
以下三种声明提供了一个比一个明显的类型信息。这三种声明在运行时是等同的,但附加的类型信息允许编译器在编译时检查变量类型,并在类型不符的情况下提出警告。


- setMyValue:(id) foo;
该声明表示“foo”可以是任何类的实例。

- setMyValue:(id <aProtocol>) foo;
该声明表示“foo”可以是任何类的实例,但它必须符合“aProtocol”协议。

- setMyValue:(NSNumber*) foo;
该声明表示“foo”必须是“NSNumber”的实例。

/**

型一致,而对于动态类型语言则完全没有这方面的问题。

[编辑] 转发Objective-C允许对一个对象发送消息,不管它是否能够响应之。除了响应或丢弃消息以外,对象也可以将消息转发到可以响应该消息的对象。转发可以用于简化特定的设计模式,例如观测器模式或代理模式。

Objective-C运行时在Object中定义了一对方法:

转发方法:
- (retval_t) forward:(SEL) sel :(arglist_t) args; // with GCC
- (id) forward:(SEL) sel :(marg_list) args; // with NeXT/Apple systems
响应方法:
- (retval_t) performv:(SEL) sel :(arglist_t) args;  // with GCC
- (id) performv:(SEL) sel :(marg_list) args; // with NeXT/Apple systems
希望实现转发的对象只需用新的方法覆盖以上方法来定义其转发行为。无需重写响应方法performv::,由于该方法只是单纯的对响应对象发送消息并传递参数。其中,SEL类型是Objective-C中消息的类型。

不是很懂:
*/

动态特性:支持运行时 动态的类方法的覆盖 和 添加新方法,同时无需再次编译


Objective-C++是C++的扩展,类似于Objective-C是C的扩展

由于在融合C++与Objective-C两种语言的特性方面没有做特别的工作,因此有以下限制:
C++类不能从Objective-C类继承,反之亦然。
Objective-C定义内部不能定义C++命名空间。
Objective-C类的成员变量不能包括不含默认构造函数和/或含有虚方法的C++类对象,但使用C++类指针并无如此限制(可以在 -init方法中对之进行初始化)。
C++“传递值”的特性不能用在Objective-C对象上,而只能传递其指针。
Objective-C声明不能存在在C++模板声明中,反之亦然。但Objective-C类型可以用在C++模板的参数中。
Objective-C和C++的错误处理语句不同,各自的语句只能处理各自的错误。
Objective-C错误使得C++对象被退出时,C++析构函数不会被调用。新的64位运行时解决了这个问题。


Objective-C 2.0”的发布,其增加了“现代的垃圾收集,语法改进[3],运行时性能改进[4]

垃圾收集Objective-C 2.0提供了一个可选的垃圾收集器。在向后兼容模式中,Objective-C运行时会将引用计数操作,例如“retain”与“release”变为无操作。当垃圾收集启用时,所有的对象都是收集器的工作对象。普通的C指针可以以“__strong”修饰,标记指针指向的对象仍在使用中。被标记为“__weak”的指针不被计入收集器的计数中,并在对象被回收时改写为“nil”。iOS上的Objective-C 2.0实现中不包含垃圾收集器。垃圾收集器运行在一个低优先级的后台线程中,并可以在用户动作时暂停,从而保持良好的用户体验。[5]


属性:

属性总是为公共的,其目的为提供外部类存取(也可能为只读)类的内部变量的方法。属性可以被声明为“readonly”,即只读的,也可以提供储存方法包括“assign”,“copy”或“retain”(简单的赋值、复制或增加1引用计数)。默认的属性是原子的,即在访问时会加锁以避免多线程同时访问同一对象,也可以将属性声明为“nonatomic”(非原子的),避免产生锁。


枚举


比起利用NSEnumerator对象或在集合中依次枚举,Objective-C 2.0提供了快速枚举的语法。在Objective-C 2.0中,以下循环的功能是相等的,但性能特性不同。

// 使用NSEnumerator
NSEnumerator *enumerator = [thePeople objectEnumerator];
Person *p;
 
while ( (p = [enumerator nextObject]) != nil ) {
    NSLog(@"%@ is %i years old.", [p name], [p age]);
}
// 使用依次枚举
for ( int i = 0; i < [thePeople count]; i++ ) {
    Person *p = [thePeople objectAtIndex:i];
    NSLog(@"%@ is %i years old.", [p name], [p age]);
}
// 使用快速枚举
for (Person *p in thePeople) {
    NSLog(@"%@ is %i years old.", [p name], [p age]);
}
快速枚举可以比标准枚举产生更有效的代码,由于枚举所调用的方法被使用NSFastEnumeration协议提供的指针算术运算所代替了。[6]

 

原创粉丝点击