您的位置:首页 > 移动开发 > Objective-C

第一篇 Object-C快速入门

2016-09-25 10:00 351 查看
from http://blog.csdn.net/fww330666557/article/details/43232593

一、概述

Object-C是OS X和iOS上的主要程序开发语言。它是C语言的超集,提供了面向对象和动态运行时(多态)的功能。Object-C继承了C语言的语法、基本类型和流程控制语句,同时添加了定义类和方法的语法。当进行动态类型识别和绑定的时候,Object-C还添加了对象结构管理和对象语法的语言层面的支持,将很多工作延迟到了运行时进行处理。

二、类的声明与实现

Object-C类声明,一般在一个独立的头文件中进行,比如声明一个名称为yourClass的类的一般格式如下:

[objc] view
plain copy

 





@Interface yourClass :NSObject  

...  

@end  

NSObject是Object-C中所有类的根类,也就是说,所有类要么从它派生,要么从它的子类派生。但你一次只能从一个类派生,因为Object-C是单继承的。

yourClass类的实现一般在yourClass.m文件中,其一般格式为:

[objc] view
plain copy

 





#import  “yourClass.h“  

@implementation yourClass  

...  

@end  

#import,它类似C语言的#include。只不过,在Object-C中,它比#include更好用,它可以防止重复包含。也就说#inlcude依然可以使用,但#import更好。

三、属性

1、属性的声明与修饰

属性就是对象的数据。属性使用@property关键字声明。一般格式如下:

[objc] view
plain copy

 





@property NSString *firstName;  

@property NSString *lastName;  

多个属性之间,可以使用逗号分隔:

[objc] view
plain copy

 





@property (strong, nonatomic) UIWindow *window;  

属性通常还会加一些修饰,来控制数据的访问和存储等:

[objc] view
plain copy

 





@property  (readonly)  NSString *firstName;  

@property  (readonly)  NSString *lastName;  

readonly与readwrite:

readonly表明该属性是只读的,外部不能修改其值。与readonly相对的修饰是readwrite,但你不必把它写出来,因为它是默认的。

atomic与nonatomic:

(atomic、nonatomic)属性用于多线程编程,属性默认是atomic的。在多线程环境下设置为atomic可以保证数据读取的一致性(因为,它将保证数据仅仅被一个线程独占。也就是说一个线程进行写操作时,将锁定该属性,不允许其他的线程进行写操作。)由于该操作会对数据进行锁操作,故会消耗较多的资源。所以在不需要进行多线程操作时建议将该属性设置为nonatomic,设置为该参数时程序在任何情况都不会锁定该属性。

strong与weak:

 
其中strong是默认的。strong表示该属性对其相应的对象是强引用。一个变量保持对一个对象的强引用,只要该变量在其作用域范围内或者直到它被赋给另一个对象或者nil为止。weak表示对属性对应的对象的弱引用。

copy、assign、retain:

copy修饰表示该属性将使用强引用,因为它必须保持它创建的新对象。

assign指定setter方法用简单的赋值,不更改索引计数(Reference Counting),一般对简单数据类型 使用assign。

retain,对象引用计数加一。

2、属性的存取方法

一般情况下,一旦你使用@property声明了一个属性,编译器就会自动为该属性生成一对存取方法。编译器生成的存取方法遵守以下命名约定:

1)用来访问属性值的方法,getter方法,其名字与属性的名字是相同的;

2)用来设置属性值的方法,setter方法,其名字以“set”开始,其后是属性名,属性名首字母大写;

属性的修饰也会告诉编译器如何生成相关的存取方法,对于readonly属性,编译器会生成getter方法,但不会生成setter方法。

你也可以为存取方法取一个你自己想要的名字:

[objc] view
plain copy

 





@property (getter=isFinished) BOOL finished;  

[objc] view
plain copy

 





@property (readonly, getter=isFinished)BOOL finished;  

除了明确调用存取方法之外,OC还提供了点语法,来访问对象的属性:

[objc] view
plain copy

 





NSString *firstName = somePerson.firstName;  

[objc] view
plain copy

 





somePerson.firstName = @"Johnny";  

点语法只是存取方法调用的一个便捷方式。当你使用点语法的时候,属性依然是通过getter或者setter方法来访问或者改变的。

点语法访问属性,同样要受到属性修饰的约束。

3、属性与实例变量

默认地,一个可读写的属性是基于一个实例变量的,这个实例变量也是编译器自动生成的。

自动生成的实例变量与属性的名字是相同的,但是多了一个下划线前缀。

尽管一个对象通过存取方法或者点语法访问自己的属性是最佳做法,但是它也可以在类实现中的,任何实例方法中,直接访问该属性对应的实例变量。下划线前缀清晰地表明你正在访问一个实例变量,而不是一个局部变量:

[objc] view
plain copy

 





- (void)someMethod {  

  NSString *myString = @"An interesting string";  

  _someString = myString;  

}  

一般而言,你应该使用存取方法或者点语法来访问属性,即使你是在它自己的类实现中访问其属性,在这种情况下,你需要使用self:

[objc] view
plain copy

 





- (void)someMethod {  

  NSString *myString = @"An interesting string";  

  self.someString = myString;  

  // or  

  [self setSomeString:myString];  

}  

self在object-c中代表当前实例。这个规则的例外会出现在当你写初始化、释放内存或自定义存取方法的时候。

四、对象与方法

1、方法

在Object-C中,有两种类型的方法,类方法和实例方法。

类方法以+开头,其基本形式如下:

+ (id)someMethod;

类方法一般都是工厂方法,返回一个实例。

实例方法以-开头,其基本形式如下:

- (void)someMethod;

方法可以不带参数,也可以带一个或多个参数,也可以有返回值:

[objc] view
plain copy

 





- (int)someMethod;  

- (void)someMethodWithValue:(SomeType)value;  

- (void)someMethodWithFirstValue:(SomeType)value1  secondValue:(AnotherType)value2;  

2、对象的创建与初始化

Object-C的对象的内存都是动态分配的,所以要使用指针来记录一个对象。

NSObject根类提供了一个类方法,alloc,用来为对象动态分配内存:

+ (id)alloc;
注意该方法的返回值是一个id类型,它表示指向一个对象的指针。

alloc方法还有一个重要的任务,就是清理分配给对象属性的内存,通过将其置为0。也就是说会它会帮你初始化对象的属性。

与+ (id)alloc对应的就是- (void) dealloc,它用来释放对象的内存,自动引用计数ARC会自动调用该函数,而不用我们手动调用。

NSObject还提供了对象的初始化方法:

- (id)init;

这是一个实例方法。在init函数中你可以为对象的属性赋予合适的初值。

与- (id)init对应的是- (void) release,调用该函数会使得对象的引用计数-1,引用计数为0的话呢,ARC就会调用- (void) dealloc释放掉对象的内存。

3、消息

对象可以发送和接受消息,一个对象通过调用该对象的一个方法发送一个消息给另一个对象。这是object-C的说法,说白了就是函数调用。

对象发送消息的最常见形式如下:

[objc] view
plain copy

 





[someObject doSomething];  

[someObject doSomething: someValue];  

对象可以给自己发送消息:

[objc] view
plain copy

 





[self saySomething:@"Hello, world!"];  

对象可以调用其父类实现的方法:

[objc] view
plain copy

 





[super saySomething:@"Hello, world!"];  

五、类扩展

类扩展一般在实现文件的最上部实现,用于扩展类的内部实现。

你可以在类扩展中声明一个属性:

[objc] view
plain copy

 





@interface yourClass ()   

@property someType someProperty;  

@end  

在类扩展中声明的属性,编译器同样会为其生成相关的存取方法和实例变量。但是它只能在类的实现内部进行访问。

你也可以声明一个实例变量(不是属性的实例变量):

[objc] view
plain copy

 





@interface yourClass ()   

{  

     someType someValue;  

}  

@end  

这个实例变量也只能在类的实现内部访问。

你还可以在类扩展中声明方法:

[objc] view
plain copy

 





@interface yourClass ()   

  

 -(void)someMethod;  

  

@end  

这个方法需要在类实现中进行实现,并且只能在类实现中进行调用。

综合起来,.m文件的基本格式如下:

[objc] view
plain copy

 





#import  “yourClass.h“  

@interface yourClass ()   

{  

     someType someValue;  

}  

[objc] view
plain copy

 





@property someType someProperty;  

[objc] view
plain copy

 





-(void)someMethod;  

@end  

一些需要注意的问题,有一些上面提到过,再过一遍吧:

1、程序的头文件和源文件的扩展名分别为.h 和.m;

2、注释:单行(//)和多行(/* … */);

3、Object_C 中的nil 相当于NULL。

4、Object_C 中的YES 和NO 相当于true 和false。
5、#import相当于#include ,导入头文件也有两种查找方式< … > 和" … ",但是#import 可自动防止同一个文件被导入多次。

6、Object_C中的所有类都必须继承自NSObject。

7、Object_C仅支持单一父类继承,不支持多重继承。

8、Object_C中所有对象都是指针的形式。

9、Object_C用self代替this。

10、Object_C使用id代替void*。

11、Object_C中用消息表示类的方法,并采用[aInstance method:argv]调用形式。

12、Object_C支持反射机制。

13、Object_C支持Dynamic Typing,Dynamic Binding和Dynamic Loading。

本篇知识点回顾:

1、了解OC语言的基本特性;

2、掌握类的声明、实现;

3、掌握属性的声明和修饰;

4、掌握对象的创建和方法的声明及实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: