OC 语法快速入门

来源: https://www.runoob.com/w3cnot...html

Interface

定义部分,清楚定义了类的名称、数据成员和方法。 以关键字@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

方法前面的 +/- 号表明函数的类型:加号(+)表明类方法(class method),不须要实例就能够调用,与C++ 的静态函数(static member function)类似。减号(-)便是通常的实例方法(instance method)。objective-c

这里提供了一份意义相近的C++语法对照,以下:编程

class MyObject : public NSObject {
protected:
    int memberVar1;  // 实体变量
    void * memberVar2;

  public:
    static return_type class_method(); // 類方法

    return_type instance_method1();    // 实例方法
    return_type instance_method2( int p1 );
    return_type instance_method3( int p1, int p2 );
}

Objective-C定义一个新的方法时,名称内的冒号(:)表明参数传递,不一样于C语言以数学函数的括号来传递参数。Objective-C方法使得参数能够夹杂于名称中间,没必要所有附缀于方法名称的尾端,能够提升程序可读性。设定颜色RGB值的方法为例:多线程

- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 宣告方法*/

[myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 呼叫方法*/

这个方法的签名是setColorToRed:Green:Blue:。每一个冒号后面都带着一个float类别的参数,分别表明红,绿,蓝三色。函数

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

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

(id)someMethod;atom

类方法通常都是工厂方法,返回一个实例。线程

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

- (void)someMethod;

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

(int)someMethod;

(void)someMethodWithValue:(SomeType)value;

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

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

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

三、Object_C 中的nil 至关于NULL。

四、Object_C 中的YES 和NO 至关于true 和false。

五、#import至关于#include ,导入头文件也有两种查找方式< … > 和" … ",可是#import 可自动防止同一个文件被导入屡次。

六、Object_C中的全部类都必须继承自NSObject。

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

八、Object_C中全部对象都是指针的形式。

九、Object_C用self代替this。

十、Object_C使用id代替void*。

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

十二、Object_C支持反射机制。

1三、Object_C支持Dynamic Typing,Dynamic Binding和Dynamic Loading。

Implementation

实现区块则包含了公开方法的实现,以及定义私有(private)变量及方法。 以关键字@implementation做为区块起头,@end结尾。

@implementation MyObject {
  int memberVar3; //私有實體變數
}

+(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

属性

属性是用来代替声明存取方法的便捷方式。属性不会在你的类声明中建立一个新的实例变量。他们仅仅是定义方法访问已有的实例变量的速记方式而已。暴露实例变量的类,可使用属性记号代替getter和setter语法。类还可使用属性暴露一些“虚拟”的实例变量,他们是部分数据动态计算的结果,而不是确实保存在实例变量内的。

实际上能够说,属性节约了你必需要写的大量多余的代码。由于大多数存取方法都是用相似的方式实现的,属性避免了为类暴露的每一个实例变量提供不一样的getter和setter的需求。取而代之的是,你用属性声明指定你但愿的行为,而后在编译期间合成基于声明的实际的getter和setter方法。

属性声明应该放在类接口的方法声明那里。基本的定义使用@property编译选项,紧跟着类型信息和属性的名字。你还能够用定制选项对属性进行配置,这决定了存取方法的行为。下面的例子展现了一些简单的属性声明:

@interface Person : NSObject {
    @public
        NSString *name;
    @private
        int age;
}

@property(copy) NSString *name;
@property(readonly) int age;

-(id)initWithAge:(int)age;
@end

性的访问方法由@synthesize关键字来实现,它由属性的声明自动的产生一对访问方法。另外,也能够选择使用@dynamic关键字代表访问方法会由程序员手工提供。

@implementation Person
@synthesize name;
@dynamic age;

-(id)initWithAge:(int)initAge
{
    age = initAge; // 注意:直接赋给成员变量,而非属性
    return self;
}

-(int)age
{
    return 29; // 注意:并不是返回真正的年龄
}
@end

属性能够利用传统的消息表达式、点表达式或"valueForKey:"/"setValue:forKey:"方法对来访问。

Person *aPerson = [[Person alloc] initWithAge: 53];
aPerson.name = @"Steve"; // 注意:点表达式,等于[aPerson setName: @"Steve"];
NSLog(@"Access by message (%@), dot notation(%@), property name(%@) and direct instance variable access (%@)",
      [aPerson name], aPerson.name, [aPerson valueForKey:@"name"], aPerson->name);

为了利用点表达式来访问实例的属性,须要使用"self"关键字:

-(void) introduceMyselfWithProperties:(BOOL)useGetter
{
    NSLog(@"Hi, my name is %@.", (useGetter ? self.name : name)); // NOTE: getter vs. ivar access
}

类或协议的属性能够被动态的读取。

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

@property (strong, nonatomic) UIWindow *window; 属性一般还会加一些修饰,来控制数据的访问和存储等:

@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,对象引用计数加一。

快速枚举

比起利用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协议提供的指针算术运算所代替了。

还有一些其余的好比类别,转发 这些都是后面再学也不要紧的

相关文章
相关标签/搜索