1.4为类添加功能 :类方法和实例方法

添加通过方法为类添加功能                                                              ios7cook目录

方法是类的建筑块。例如,一个名为Person类可以有,如散步逻辑功能,呼吸,吃饭,喝水。这些功能通常是封装的方法。
一种方法可以带参数,当调用方法,或者仅显示该方法时,调用者传递的变量。例如,在一个简单的世界里,我们有一个Person类的walk方法。如果你愿意,你可以添加一个参数或参数的方法,并将其命名为CGFloat类型的walkingSpeed??,所以,当另一个程序员调用你的类的方法,她可以指定哪些人有走的速度。你作为这个类的程序员,会再编写相应的代码,你的类来处理不同的速度行走。如果这一切听起来像太多的不要担心,但是看看下面的例子,在这里我添加了一个方法,我们在“创建并利用类”第5页Person类中创建的实现文件:

 #import "Person.h"
    @implementation Person
- (void) walkAtKilometersPerHour:(CGFloat)paramSpeedKilometersPerHour{ /* Write the code for this method here */
}
- (void) runAt10KilometersPerHour{
        /* Call the walk method in our own class and pass the value of 10 */
?8 |
Chapter 1: Implementing Controllers and Views
        [self walkAtKilometersPerHour:10.0f];
    }
@end

一个典型的方法在Objective-C以修饰符:
1,前缀告诉编译器的方法是否是一个实例方法( - )或类方法(+)。一个实例方法只能程序员分配和初始化你的类的实例,才能访问他。类方法可以直接从类本身调用它来访问。不要担心,如果这一切听起来很复杂。我们将看到在这本书中这些方法的例子,所以不要挂在这了吧。
对于方法2,一种数据类型,如果该方法返回的任何值。在我们的例子中,我们指定无效的,告诉我们编译器不返回任何东西。
3,方法名后面的第一个参数的第一部分。你没有返回任何参数的方法。你可以有不带参数的方法。
4,第一个参数如下后续的参数列表: 
让我告诉你一个方法的例子有两个参数:

- (void) singSong:(NSData *)paramSongData loudly:(BOOL)paramLoudly{ /* The parameters that we can access here in this method are:
         paramSongData (to access the song‘s data)
         paramLoudly will tell us if we have to sing the song loudly or not
         */
}

重要的是要记住,在每一个方法的每个参数都有一个外部和内部名称。外部名是该方法的一部分,而内部部分是实际的名称或可以在方法的实施中所用的参数的别名。在前面的例子中,第一个参数的外部名称是singSong,而它的内部名称是paramSongData。第二个参数的外部名称是loudly,但它的内部名称是paramLoudly。方法名和它的参数的外部名相结合,形成了被称为选择器的方法。的选择器,用于在这种情况下,上述方法将singSong:loudly:。一个选择,你会在本书后面看到的,是每一个方法的运行时标识符。没有两个里面一个类的方法可以有相同的选择。

在我们的例子中,我们定义了三种方法为我们的Person类,其内部实施文件(Person.m):
•walkAtKilometersPerHour:

•runAt10KilometersPerHour

•  singSong:loudly:

如果我们希望能够使用从外界任何这些方法 - 例如,
从应用程序委托,我们应该暴露在我们的接口文件的方法(Person.h):

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
- (void) walkAtKilometersPerHour:(CGFloat)paramSpeedKilometersPerHour;
- (void) runAt10KilometersPerHour;
/* Do not expose the singSong:loudly: method to the outside world.
     That method is internal to our class. So why should we expose it? */
@end

鉴于此接口文件,程序员可以调用walkAtKilometersPerHour:从Person类外runAt10KilometersPerHour方法,而不是单调的:

singSong:loudly:方法,因为它并没有在该文件中公开。因此,让我们继续前进,尝试调用所有这三种方法从我们的应用程序委托,看看会发生什么!

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
        Person *person = [[Person alloc] init];
        [person walkAtKilometersPerHour:3.0f];
        [person runAt10KilometersPerHour];
        /* If you uncomment this line of code, the compiler will give
         you an error telling you this method doesn‘t exist on the Person class */ /*如果去掉这一行代码,编译器会给出          你的错误,告诉你这种方法不会对Person类存在*/
        //[person singSong:nil loudly:YES];
        self.window = [[UIWindow alloc]
                       initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];
return YES;
}

现在我们知道了如何定义和调用实例方法,但对于类的方法?让我们先了解一下什么类的方法,他们从实例方法的区别。
一个实例方法是,涉及到一个类的实例方法。例如,在我们的Person类,你可以实例化该类两次来创建您正在使用两个不同的人在一个假设的游戏,有那些人之一,走在一个时刻3公里的速度,而其他人走在2公里的时速。
即使你写的代码的步行实例方法只有一次,当在运行时会创建两个单独的Person类的实例时,调用实例方法将被路由到这个类的相应实例。
相反,类方法的类本身的工作。例如,在一个游戏,你有点亮你的游戏风景类名为光之情况下,你可能有一个dimAllLights类方法在这个类,程序员可以调用昏暗的灯光都在游戏中,无论他们在哪里放置。让我们一起来看看我们的Person类一个类的方法的例子:

#import "Person.h"
@implementation Person
+ (CGFloat) maximumHeightInCentimeters{ return 250.0f;
}
+ (CGFloat) minimumHeightInCentimeters{ return 40.0f;
}
@end

该maximumHeightInCentimeters方法是一个类方法,它返回的任何人以厘米为单位的假想最大高度。该minimumHeightInCentim ETERS类方法返回的任何人的最低高度。下面是我们如何再暴露在我们的类的接口这些方法:

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *firstName; @property (nonatomic, copy) NSString *lastName; @property (nonatomic, assign) CGFloat currentHeight;
+ (CGFloat) maximumHeightInCentimeters; + (CGFloat) minimumHeightInCentimeters;
@end

我们还为我们命名currentHeight Person类增加了新的浮点性能。这允许这个类的实例,以便能够存储其高度在存储器中用于以后参考,就像他们的第一或最后一个名称。
而在我们的应用程序的委托,我们将继续使用这些新的方法,如下所示:
??

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
Person *steveJobs = [[Person alloc] init]; steveJobs.firstName = @"Steve";
steveJobs.lastName = @"Jobs"; steveJobs.currentHeight = 175.0f; /* Centimeters */
if (steveJobs.currentHeight >= [Person minimumHeightInCentimeters] && steveJobs.currentHeight <= [Person maximumHeightInCentimeters]){
/* The height of this particular person is in the acceptable range */
}else{
/* This person‘s height is not in the acceptable range */
}
        self.window = [[UIWindow alloc]
                       initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];
return YES;
}
时间: 2024-11-06 15:27:41

1.4为类添加功能 :类方法和实例方法的相关文章

修复VS2008 MFC类添加功能[转载+编辑]

VS2008 MFC类向导不能正确加载启动类向导给对话框添加类时出现网页错误提示:"行: 815错误: 对象不支持此属性或方法"勾选"使用 Internet Explorer 中的内置脚本调试程序"后再次出现页面错误提示:"行: 815char 3错误:对象不支持此属性或方法代码:0URL:file:///D:/Microsoft%20Visual%20Studio%209.0/VC/VCWizards/CodeWiz/MFC/Simple/HTML/20

ios开发总结:Utils常用方法等收集,添加扩展类,工具类方法,拥有很多方便快捷功能(不断更新中。。。)

BOBUtils 工具大全 本人github开源和收集功能地址:https://github.com/niexiaobo [对ios新手或者工作一年以内开发人员很有用处] 常用方法等收集.添加扩展类.工具类方法.请求方法封装(包括图片上传等)等等 拥有很多方便快捷功能 ^_^ 用法: 只需要导入BOBsKit.h 头文件就行 // #import "BOBsKit.h" 依赖三方库: pod 'SDWebImage', '~> 3.7.5' pod 'MBProgressHUD'

Java基础知识强化39:StringBuffer类之StringBuffer的添加功能

1. StringBuffer的添加功能: public  StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身. public  StringBuffer insert(int offset, String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身. 注意:这两个方法都是返回字符串缓冲区对象本身,这样才能节省内存. 2. 案例演示: 1 package cn.itcast_02

在项目中谨慎为系统类添加分类!!!!!

结论: 1.坚决杜绝为系统类做方法交换(见到[class_replaceMethod]格杀勿论!) 2.为系统类添加分类时候,属性和方法名必须加上[世上独一无二]的前缀,避免冲突和混淆. 之所以让我对上述行为恨之入骨是因为,今天为了一个bug,我花了将近半天时间苦苦追寻原因. 我只是使用了一个简简单单的UIImagePickerController的拍照的功能界面,奇葩的现象是,点击快门按钮时---可以看见界面中的按钮发生了视觉上的响应,但是却没有功能上的响应(按道理,我这边按下按钮的时候,拍照

StringBuffer类的功能

StringBuffer类 1.添加功能 public StringBuffer append(String str):可以把任意类型数据添加到缓冲区,并返回缓冲区域 public StringBuffer insert(int offest,String str):在指定位置可以把任意类型数据添加到缓冲区,并返回缓冲区域 2.删除功能 public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身 public StringBuffer

Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Qt的国际化. QTextCodec QTextDecoder QTextEncoder QTranslator QLocale Languages and WritingSystems 有时,国际化是比较简单的,例如,把美国的应用程序让澳大利亚或英国的用户可访问,只需要简单的改变拼写.但是,把美国的

【ListViewJSON】【工具类的功能与实现】

接上一篇博客,这篇博客的重点是分析listviewjson项目中的工具类的功能,以及如何更好地使用这套工具. 项目源码结构图: 假设现在有一个新的项目,同样是解析json数据,并将其显示到listview中. 那么现在考虑一下如何在两个项目之间进行移植. 首先com.demo.app.common是可以直接进行移植的. 那么需要重新写的就是1.bean 2.adapter 3.以及所有和获取列表数据有关.将数据加载到listvie文中有关的类. MainActivity中通过 NewsList

iOS类添加方法、属性学习笔记

一.在运行时为类添加方法 我们首先定义了一个EmptyClass,继承NSObject,没有任何自带方法,接着定义了一个函数.这里提一句,Obj-C的方法(method)就是一个至少需要两个参数(self,_cmd)的C函数,这个函数仅仅输出一句Hello.接下来在addMethod方法中,我们调用class_addMethod()为EmptyClass添加方法,class_addMethod()是这样定义的: BOOL class_addMethod(Class cls, SEL name,

oc类的功能的拓展与延展

类的扩展 一   类目 (类目也称为分类,为没有源码的类添加方法.) 1.作用 1)可以扩展别人的类,可以作为子类的替代方法. 2)把同一类的代码放到多个文件中. 2.形式 1)文件名:目标类+类目名.h 目标类+类目名.m 2).h文件中 @interface 需要扩展的类的类名(分类名) -( )method: @end eg: 为字符串添加一个类 NSString+SayHi.h @interface NSString (SayHi) -(void)sayHi;//为字符串添加方法 @en