Objective-C中类和方法的定义以及协议的使用_IOS

类和方法的定义
一般类都是继承NSObject,新建一个类时父类选择NSObject即可,oc只有单继承,没有多继承。

下面以一个简单的oc工程来讲解(需配置好Xcode工具以相应的SDK),会建工程的请直接跳到‘六'步骤。

一、新建一个oc编译环境,打开xcode->File->New->Project(快捷键 command+shift+N)。

二、选择OS X--Application--Command Line Tool,选择next

三、填写项目名称(最好英文),你自己的名字,和公司的标志。Type选择Foundation,下面的勾表示是否选择ARC,建议初学者勾上。点击next

四、此时工程建好了,会看到一个main.m文件,所有的调用都在main.m中完成。

新建一个类,command+N,选择父类NSObject,取名people

五、点击next之后,出现以下界面,切记下面的√要打上。否则在编译时工程搜索不到此文件,会出现编译错误。

六、在people.h文件interface中添加变量,NSString为OC的字符串变量。

复制代码 代码如下:

@interface Person : NSObject {
    
    NSString * _name;
    int _age;
    
}

然后在{}外面定义变量的初始化方法和set方法,格式:-(类型)方法名:(参数类型)参数1 参数名:(参数类型)参数2……,set方法名一般为set变量名,变量名首字母大写,此未苹果官方文档上的说明

复制代码 代码如下:

-(void)setAge:(int)age;
 
-(void)setName:(NSString *)name;

定义变量的get方法,get方法名同样为get变量名

复制代码 代码如下:

-(int)age;
 
-(NSString *)name;

七、在people.m文件中实现people.h文件中声明的方法。

复制代码 代码如下:

-(void)setAge:(int)age {
 
    _age = age;
 
}
 
-(void)setName:(NSString *)name {
    _name = [name copy];//copy方法涉及到oc的内存管理机制。使用copy可防止内存泄露
}

-(int)age {
    return _age;
}
-(NSString *)name {
    return _name;
}

七、在main.m中定义一个people类,并对其属性变量进行初始化。
定义一个people类:

复制代码 代码如下:

Person *dwight = [[Person alloc] init];

给其属性赋值:

复制代码 代码如下:

[dwight setName:@"Dwight Schrute"];
 
[dwight setAge:38];

打印值:

NSLog(@"%@ (%d)", [dwight name], [dwight age]);
PS:一般NSString,NSArray,NSDictionary,NSData等类型的值打印用%@,int等C中的类型,按照C语言打印的关键字打印,NSInteger,NSNumber打印时用%d。

打印结果:

protocol协议,设置代理
协议(protocol)是ObjC中很重要的一部分,它用来定义可由任何其他类完成的方法,当本类中需要完成某些功能时,可由protocol来实现
protocol在三种情况中需要用到:

需要声明别的类期望完成的方法时
在隐藏自身类的情况下声明该类对象的接口时
在某些没有继承关系的类之间获取其之间的相似性,即两个类之间没有继承关系,但是都需要实现同样的方法时,就可通过代理来实现。
protocol文件中只是定义一些方法,当你在类中实现了这个protocol时,你就需要补充这些方法,系统会自动调用这些方法
protocol中方法分为@required和@optional,其中在@required下的方法必须实现,@optional中方法是选择性实现,也可不实现。

下面以一个简单实例说明protocol的用法(OS X下)在iOS下同样使用

一、新建一个Objective-C class,命名为iOSCoder

①、在iOSCoder@end后面定义一个protocol,命名为MyprotocolDelegate,并声明@required和@optional方法

②、在#import后声明@protocol MyprotocolDelegate

③、在interface中声明属性@property(nonatomic,assign) id<MyprotocolDelegate>   delegate;

整个.h文件如下

复制代码 代码如下:

#import <Cocoa/Cocoa.h>
 
@protocol MyprotocolDelegate;
 
@interface iOSCoder : NSObject
//声明delegate属性
@property(nonatomic,assign) id<MyprotocolDelegate>   delegate;
 
@end

复制代码 代码如下:

//定义protocol
@protocol MyprotocolDelegate <NSObject>
//必须实现方法
@required
-(void)StartObjectiveC;
-(void)StartPrograming;
//选择实现方法
@optional
-(void)StartJavaScript;
-(void)StartPython;
 
@end

二、在需要用到iOSCoder类的文件中,声明并进行初始化
如果要用到iOSCoder中的delegate,则必须在.h文件中进行声明,声明格式

@interface 类名:继承类<MyprotocolDelegate>

定义iOSCoder对象

复制代码 代码如下:

iOSCoder *ios = [[iOSCoder alloc] init];
    ios.delegate = self;
    if ([ios respondsToSelector:@selector(StartObjectiveC)]) {
        [self StartObjectiveC];
    }
    if ([ios respondsToSelector:@selector(StartPrograming)]) {
        [self StartPrograming];
    }

实现required方法

复制代码 代码如下:

-(void) StartObjectiveC
{
    NSLog(@"@required,StartObjectiveC");
}
-(void)StartPrograming
{
    NSLog(@"@required,StartPrograming");
    
}

附:在iOS ViewController中使用时

假设A要跳转到B页面时需要在B页面中实现A中的protocol方法

.h文件

复制代码 代码如下:

#import <UIKit/UIKit.h>
@class AViewController;
@protocol ADelegate <NSObject>
 
- (void) AMethod
 
@end

复制代码 代码如下:

@interface AViewController : UIViewController
{
     id<ADelegate> _delegate;
    
}
@property(nonatomic,assign)id<ADelegate> delegate;
@end

在页面跳转之前加上

复制代码 代码如下:

if (_delegate && [_delegate respondsToSelector:@selector(AMethod)]) {
          [_delegate AMethod];
     }

在B页面中声明代理<ADelegate>,实现AMethod方法,实例化A对象,并设置代理
则在B界面会调用AMethod方法,即完成了protocol的实现

时间: 2024-08-30 09:31:38

Objective-C中类和方法的定义以及协议的使用_IOS的相关文章

JS中类或对象的定义

 本篇文章主要是对JS中类或对象的定义进行了说明介绍,需要的朋友可以过来参考下,希望对大家有所帮助 我们知道,JS是面向对象的.谈到面向对象,就不可避免的要涉及类的概念.一般像c#,java这些强类型语言都有固定的定义类的语法.而JS的不同之处在于它能使用各种方法实现自己的类和对象.一般的实现有以下几种方式:   1.工厂方式 工厂方式是指创建一个返回特定对象类型的工厂函数,示例代码如下:  代码如下: function createCar(sColor,iDoors,iMpg) {    va

浅析Java编程中类和对象的定义_java

1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么事对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于类与对象的描述:类是对象的模版,对象是类的一个个体. 3,Java中定义类的方法? class 类名 用Java语法定义人类: public class Person { } 4,对象的定义方法? 1,对象声明:类名 对象名: 2,对象创建 对象名 =  new 类名(): new作用:分配内存空间. 也可以合写为:类名 对象名 =

textboxdeleave事件-如何获取TEXTbox的leave事件方法中定义的摸个bool类型变量的值

问题描述 如何获取TEXTbox的leave事件方法中定义的摸个bool类型变量的值 private bool txtShapeCode_Leave(object sender, EventArgs e) { bool CheckShapeCode = true;//单输入的条码不存在时赋值为false string sql = "select + from goodInfo where gID = '"+this.txtGoodsNumber.Text+"'";

java的新手,方法的定义。

问题描述 java的新手,方法的定义. 正在学习java,感觉特别难.一些方法用过好几次都记不住.和它的作用,刚记住,结果学习新的知识,就混淆了. 解决方案 新手笔记之方法的定义java数组定义方法JAVA中定义数组的各种方法 解决方案二: 楼主要表达什么东西?其实java很好学,你只要知道你学习的方法是什么意思就行了,开发的时候使用集成开发工具,会有方法提示给你,你只要选择使用哪个方法就行了.所以不用太担心了. 之后在项目开发中你会经常使用某个方法,多用了就熟悉了,完全不用担心 解决方案三:

c#调用dll-调用非托管dll中类的方法

问题描述 调用非托管dll中类的方法 如何用c#来调用c++生成的dll文件中的类的方法? 解决方案 重写为C#的类,否则没办法

java 内部类-java方法中定义的局部内部类问题

问题描述 java方法中定义的局部内部类问题 在方法中定义的内部类为什么只能访问方法中的final类型局部变量? package com.study; interface OutInterface2{ //定义一个接口 } class OuterClass3 { public OutInterface2 doit(final String x){//doit方法参数为final类型 //在doit()方法中定义一个内部类 class InnerClass2 implements OutInter

主类-JAVA主语句中不能放循环或条件语句,那如何在其他方法中使用这个方法中定义的整型

问题描述 JAVA主语句中不能放循环或条件语句,那如何在其他方法中使用这个方法中定义的整型 public void tian(){ int k=0; } public void tian2(){ for(;k<5;k++){ break; } } 这样? 解决方案 不太明白楼主的意思 定义在方法内的变量是局部变量,其他方法是找不到的 不过你可以在调用方法的时候作为参数把这个变量的值传过去 解决方案二: 这什么问题-- 局部变量的作用域就在本域内,怎么作用在外部? 难道JAVA出新特性了? 解决方

java语法-java中类.this.方法问题

问题描述 java中类.this.方法问题 java中 类.this.方法 我们都知道this是表示当前类的对象或者方法 那前面带类表示什么意思呢 解决方案 内部类获取外部类的引用 解决方案二: [java]this的使用方法Java中this的使用方法Lesson_for_java_day08--类的属性和方法.类的封装性.构造函数和this的使用 解决方案三: 你从哪看到的这种写法.来图

&amp;amp;quot;xxx&amp;amp;quot;(类) 并不包含 &amp;amp;quot;yyy&amp;amp;quot;(方法) 的定义 的错误怎么解决啊?

问题描述 我用VS08写的一个类,编译时老是说"xxx"(某类)并不包含"yyy"(某方法)的定义只要有调用xxx中的方法就会报这个错,但我的类中明明有该方法,而且如果我无视它,继续运行的话,还是能正常该类的方法的.请问这是为什么啊?怎么解决啊?难道是vs的bug? 解决方案 解决方案二:肯定程序问题.重新生成下解决方案三:我只知道2003里经常出现这样的问题...解决办法就是在项目引用中移除那个类,然后重新引用...解决方案四:看看把方法修饰符写为public或者