TAG

RSS订阅

收藏本站

设为首页

当前位置:主页 > 移动开发 > IOS开发 >

IOS Object-c学习之设计类接口与类实现

发布时间:2014-12-07 14:19 类别:IOS开发

原文地址http://cocoadevcentral.com/d/learn_objectivec/ 
译者前言 
在网上看到这篇文章觉得写的很不错,但是貌似没有人翻译成中文,我就大胆翻译
了。

设计类接口 
 
在Objective- C 的语法中,创建一个类是非常简单的。一个类通常分为两部分。
类的接口(interface)通常存放在类似ClassName.h 的文件中,在这里,我们
定义实例变量和公用(public )方法。
 
类的实现存放在ClassName.m 这样的文件中,它包含了这些方法的实际实现代码。
它通常还定义了客户类不能访问的私有(private)方法。
一个接口文件看上去像以下这样的。这个类名字叫做Photo,所以接口文件名是
Photo.h: 
#import <Cocoa/Cocoa.h>
 
@interface Photo : NSObject { 
   NSString* caption;
   NSString* photographer;

@end
 
首先,我们导入了Cocoa.h,目的是将 Cocoa应用程序的基本类添加进来。#import
指令会自动防止将同一个文件导入多次。
@interface表明这是类Photo的声明。冒号后面指定父类(superclass),这里
父类是NSObject 。
在花括号里面声明了两个实例变量:caption 和photographer。都是 NSString
类型,实例变量可以是任何对象类型,包括id类型。
最后,@end符号结束类的声明。
添加方法 
让我们给实力变量添加一些获取器(getter ) 
#import <Cocoa/Cocoa.h>
 
@interface Photo : NSObject { 
   NSString* caption;
   NSString* photographer;

 
-   caption; 
-   photographer; 
 
@end
 
记住,Objective- C 语言中通常省略方法的“get ”前缀。方法名字前面的单个减
号( - ) 表明该方法是一个实例方法。如果方法名字前面是一个加号(+) ,则表明该方法
是一个类(static )方法。
编译器会默认一个方法的返回值是一个id类型的对象,所有的输入参数也默认是id
类型。上述代码在技术上是正确的,但是我们一般不这样写,我们需要给这些方法指定
返回值类型。
#import <Cocoa/Cocoa.h>
 
@interface Photo : NSObject { 
   NSString* caption;
   NSString* photographer;

 
-  (NSString*)caption;
-  (NSString*)photographer;
 
@end
 
现在,我们来添加设置器(setter) :
 
#import <Cocoa/Cocoa.h>
 
@interface Photo : NSObject { 
   NSString* caption;
   NSString* photographer;

 
-   (NSString*) caption; 
-   (NSString*) photographer; 
 
-  (void)  set Caption: (NSString*)input; 
-  (void)  setPhotographer: (NSString*)input; 
 
@end
 
设置器不需要有返回值,所以我们指定返回值是void。
 
类实现 
现在, 我们从获取器(getter)开始,来创建一个类的实现。 
#import "Photo.h"
 
@implementation Photo 
 
-  (NSString*) caption {
    return  caption;

 
-  (NSString*) photographer {
    return  photographer;

 
@end
 
这段代码以@implementation和类的名字开始,并且像接口一样,有一个@end。
所有的方法必须写在这两条语句之间。
如果你写过代码,就会觉得上面的获取器看上去很熟悉,所以我们还是来看一看设
置器,它们需要多一点解释。
 
-  (void) setCaption: (NSString*)input 

    [caption  autorelease ];
    caption = [input retain ];

 
-  (void) setPhotographer: (NSString*)input 

    [photographer  autorelease ];
    photographer = [input retain ];

 
每一个设置器都要处理两个变量,第一个是当前引用的对象,第二个是新输入的对
象。在带有垃圾回收机制的环境中,我们可以直接设置成新的值。
-  (void) setCaption: (NSString*)input 

    caption = input; 

但是,如果你不能使用垃圾回收,你需要release旧的对象,并且retain 新的对
象。
释放一个对象的引用实际上有两种方法:release 和 autorelease。标准的
release会立刻释放对象的引用。autorelease 会等一会儿才释放,但是引用实际上
会一直存在,直到当前方法结束(除非你添加自定义的代码来明确的改变它)。
在设置器里面使用autorelease 方法会更加安全一些,因为要改变的变量的新旧两
个值可能指向的是同一个对象。而你可能不希望立刻释放实际上你要保留的对象。
现在,这看上去有点让人迷惑,但是随着你的不断学习,你就会有更多的认识。所
以,现在不必彻底的理解这些。
Init  
我们可以创建一个init 方法用来给我们的实例变量设置初始化值: 
-  (id)  init

    if ( self = [ super init] ) 
    { 
        [self setCaption:@"Default Caption"]; 
        [self setPhotographer:@"Default Photographer"]; 
    } 
    return self;

这段代码是完全不需要加以说明的,尽管第二行看上去有点不常见。它是一个单个
的等号(= ),作用是将[super init]的结果赋值给self。
这实际上是要求父类做(父类的)初始化操作。if语句的作用是在尝试设置(本对
象的)缺省值之前验证父类是否初始化成功。
Dealloc 
dealloc 方法在一个对象从内存中删除时被调用。通常在这个方法里面释放所有对象
里的实例变量。 
‐  (void) dealloc  
{  
        [caption  release ];  
        [photographer  release ];  
            [super dealloc ];  
}  
在前两行,我们直接调用了实例变量的release 方法。在这里,我们不需要使用
autorelease ,因为标准的release 更快一些。 
最后一行非常重要,我们发送了一个[super dealloc]消息,要求父类做清理工作。如
果我们不做的话,该对象就不会被从内存中删除,这就造成了内存泄露。 
当启用垃圾回收机制时,对象的dealloc 方法不会被调用。此时,你可以实现一个
finalize 方法来代替它。
 
猜你会喜欢....

Copyright © 2015 www.wahenzan.com 哇!很赞 版权所有 浙ICP备14030256号-1 Power by DedeCms

浙公网安备 33010602005986号

声明:本站所有文章除标明原创外,均来自网络转载,版权归原作者所有,如果有侵犯到您的权益,请联系本站删除 网站管理员:758763728

360网站安全检测平台