您的位置:华清远见教育科技集团 >> 新闻动态 >> iOS资料 >> iOS开发入门:Objective-C基础语法(二)  
 
iOS开发入门:Objective-C基础语法(二)
分享到:

已声明的属性和存取方法

一个属性,按通常的理解就是对象封装的状态里的一项。它要么是一个特性,比如名字或者颜色;要么是与另一个或多个其他对象的关联。对象的类定义了一个接口,使用该对象的用户可以获取(get)和设置(set)封装属性中的数值。而执行这个功能的方法就叫做存取方法。

存取方法共有两种,且都要符合一套命名规约。“Getter(取值器)”存取方法能够返回某个属性的值,它的方法名和该属性同名。“Setter(赋值器)”存取方法能够给某个属性赋予新的值,它的命名规约是 set属性名称: 这样的形式,属性名称的首字母大写。在 Objective-C 框架中,只有严格按照规约对存取方法进行命名才能实现多种技术。

Objective-C 提供了已声明的属性,可以作为声明的便利途径,有时还能作为存取方法的实现。在之前的ios应用程序开发教程中,你曾经声明了 userName 属性:

@property (nonatomic, copy) NSString *userName;

已声明的属性使得 getter 和 setter 方法无需在类里显式声明。相反,你在声明属性时可以决定其具体行为方式,然后要求编译器基于属性声明,生成(或说创建)实际可用的 getter 和 setter 方法。已声明的属性减少了大量不必要的代码,节省开发者的时间,并且让你的代码更加清爽、减少出错的可能。

在类接口文件中,要包含属性声明和方法声明。基本的声明要使用 @property 编译器指令,后面是属性的类型和名称。你还可以为属性设定不同的选项,也就是说可以调整存取方法的具体行为方式,比如属性是否为弱引用,或者是否为只读属性。这些选项写在 @property 指令后边的圆括号中。

下边的几行代码展示了更多属性声明的例子:

@property BOOL flag;         // 默认是只声明类型和名称
    @property (copy) NSString *nameObject; // 在赋值过程中拷贝对象
    @property (readonly) UIView *rootView; // 只声明 getter 方法

在类的实现代码中,你要使用 @synthesize 编译器指令来要求编译器根据声明的情况,生成存取方法:

@synthesize flag;
    @synthesize nameObject;
    @synthesize rootView;

你也可以把 @synthesize 语句放到一行里面:

@synthesize flag, nameObject, rootView;

@synthesize 指令中,你还可以命令编译器添加相应的实例变量到类定义中去。要增加一个实例变量,在属性的名称后面写一个等号,然后写你想要的实例变量名称:

@synthesize nameObject=_nameObject;

块对象

块对象是封装了一系列功能的一个对象,或者更通俗地讲,它是一个代码片段,能够在任何时刻被执行。它们本质上就是可移植的匿名的函数,可以作为其他方法的参数传入,也可以作为其他方法或函数的返回值。块对象本身有含类型的参数表,可能带有不确定的或已声明的返回值类型。你可以把一个块对象赋值给某个变量,然后在你需要的时候像调用函数一样调用它就行了。

脱字符(^)是块的语法标记。还有按照我们熟悉的参数语法规约所定义的返回值以及块对象的主体(也就是可以执行的代码)。下图是如何把块对象赋值给一个变量的语法讲解:

接下来,按照调用函数的方式调用块对象变量就可以了:

int result = myBlock(4); // 结果是 28

块对象可以在局部作用域之内共享数据。块对象的这个特性非常有用,假设你实现了一个方法,该方法定义了一个块对象,那么这个块对象就可以访问该方法内的局部变量和参数(包括堆栈变量),也可以访问函数和全局变量,甚至包括实例变量。这种访问是只读性质的,但如果变量声明使用了 __block 修饰符,则它的值可以在块对象中被改变。即使在方法或函数封装的块对象返回一个值并销毁其作用域之后,只要对该块对象的引用不消失,局部变量作为块对象的一部分将一直存在。

和方法、函数的参数类似,块对象可以被当作一个回调函数。当方法或函数被调用时,它们会执行某些功能,并在合适的时机回调之前调用它们的代码(通过块对象),来请求附加信息,或者从中获取程序特定的行为。块对象让调用者能够在调用的时候提供回调代码。块对象不会将请求数据打包到一个“上下文”结构中,而是从方法或函数的相同作用域中捕获数据。由于块对象代码无需在单独的方法或函数中另外实现,所以你的实现代码能够变得更加简洁,可读性更强。

Objective-C 框架有许多带有块对象参数的方法。比如这段,在 UIKit 框架里声明了如下类方法,它有两个块对象参数:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

这个方法可以让你生成一个动画效果。第一个块对象参数用来选择动画效果;第二个块对象参数指定动画完成后要执行的任务。下面的例子中,第一个块对象将视图动画的结尾 alpha 值设为 0(让它变成透明的)。第二个块对象则把整个视图移除。

[UIView animateWithDuration:0.2 animations:^{
        view.alpha = 0.0;
        } completion: ^(BOOL finished) {
        if (finished == YES)
            [view removeFromSuperview];
    }];

 更多相关文章

·iOS开发入门:Objective-C基础语法(二)
·iOS开发入门:Objective-C基础语法串讲
·iOS开发入门:Objective-C语言简介
·iOS 应用程序开发教程:十、排除故障和检查代码
·iOS 应用程序开发教程:九、实施视图控制器