导航:首页 > 方法技巧 > ios如何调用方法

ios如何调用方法

发布时间:2023-07-01 01:36:35

1. ios 怎么调用分类里面的方法

ios category类别的使用
Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category)。类别用于对一个已经存在的类添加方法(Methods)。你只需要知道这个类的公开接口,不需要知道类的源代码。需要注意的是,类别不能为已存在的类添加实例变量(Instance Variables)。

类别的基本语法如下:
@interface ClassName(CategoryName)
//method declarations
@end
@interface 类名(类别名)
类别方法申明
@end
注意几点:
1.现有类的类名位于 @interface之后
2.括号中是类别的名称(只要名称唯一,可以添加任意多的类别)
3.类别没有实例变量部分
类别的语法与类的语法非常相似。类别的方法就是类的方法。类别的定义可以放在一个单独的文件中("类别名.h"), 也可以放在一个已存在的类的定义文件中(.h文件)。类别的实现则可放在一个单独的“类别名.m”文件中,或另一个类的实现文件中。这点也与类的定义相似。因为类别的方法就是类的方法,所以类别的方法可以自由引用类的实例变量(无论公有或私有)。

子类(subclassing)是进行类扩展的另一种常用方法。与子类相比,类别最主要的优点是:系统中已经存在的类可以不需修改就可使用类别的扩展功能。例如,假设系统中存在一个类A;另外一个类B中定义了一个类A类型的实例变量,并包含了类A的头文件“#import <A.h>"。假设一段时间后,需要对类A扩展几个新的方法。如果用子类,就需要创建一个子类A-1。如果类B想要使用类A的新方法,就要进行如下修改:1) 将包含的头文件改为"#import<A-1.h>"; 2)将所有用到的类A对象改为类A-1的对象。可以想象,如何有很多类需要用到类A的新功能(比如类A是iOS中的类UIViewController),随着系统的升级(iOS从1.0到5.0),你的程序需要不停地进行这种繁琐地修改。如果使用类别,即使类A升级了,系统中其它的类可以不需任何修改,直接就可以调用类A的新方法。

类别的第二大优点是实现了功能的局部化封装。类别定义可以放在一个已存在的类(类A)的定义文件中(.h)。这意味着这个类别只有在类A被引用的前提下才会被外部看到。如果另一个类(类B)不需要用到类A的功能(没有包含类A的.h文件),也就不会看到依附类A存在的类别。iOS SDK中广泛运用这种类别定义法来封装功能。例如,在 UINavigationController.h中定义了专为UINavigationController扩展的UIViewController类别:

@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem;
@property(nonatomic,readonly,retain) UINavigationController *navigationController;
......
@end
如果一个类不引用UINavigationController.h,也就不会看到navigationItem和navigationController这两个性质申明(declared property)。

类别的另一个优点是轻巧(light-weight)。很多时候,对已存在的类所需的扩展仅仅是几个新方法。这时,用类别避免了在系统中留下很多非常短小的“微”子类,使程序更加紧凑。

归纳:
1、实现类别
同实现类相似,实现方法即可
2、 类别的局限性
1.类别不能添加新的实例变量
2.命名冲突,如果类别中方法和类中已有方法同名,则类别具有更高优先级
3 类别的作用
1.将类的实现分散到多个不同文件或多个不同框架中
2.创建私有方法的前向引用
3.向对象添加非正式协议
4 利用类别分散实现
利用类别可以将类的方法分散到多个源文件中
特别指出的是:类别可以访问其继承的类的实例变量
在使用一个方法时,对象的方法是在接口中声明、父类中声明、还是类别中声明并不重要
类别不仅可以分散实现到不同源文件,也可跨框架
5、 使用类别创建前向引用
虽然可以实现未声明的方法,但是编译器会提出警告
通过类别可以提供声明,而且,声明的方法不必要一定在类别的实现中实现,也可以在类的实现中实现
6、 非正式协议和委托类别
委托(delegage)是一种对象,另一个类的对象会要求委托对象执行它的某些操作
委托对象接受其它对象对它的特定方法的调用
其实就是委托对象必须实现别的对象调用的方法,与接口类似
7、 ITunesFinder项目
8 、委托和类别
委托和类别有什么关系?委托强调类别的另一种应用:被发送给委托对象的方法可以声明为一个NSObject的类别
创建一个NSObject的类别称为“创建一个非正式协议”
9、 响应选择器
选择器只是一个方法名称,可以使用@selector()预编译指令指定选择器,其中方法名位于圆括号中,但它以OC运行时使用的特殊方式编码,以快速执行查询
NSObject提供了一个respondsToSelector的方法,询问对象以确定其是否实现某个特定消息
10、 选择器的其他应用
选择器可以被传递,可以作为方法参数,甚至可以作为实例变量存储

2. ios怎样调用类方法

类方法也叫工厂方法,一般用加号“+”修饰
不需要创建对象就直接可以使用,直接使用类名久可以调用,例如:[NSString stringWithFormat:@"%@",@"123"];

3. iOS分类中调用主类原实例、类方法

看到里面有一个 struct objc_method_list ** methodLists ,这就是存储该类所有方法的地方了。查找方法的时候并不是每次都去遍历methodList的,而是先去cache中查,cache中存储了最近常用的方法。

看一下objc_method_list这个结构体

它有一个指向存储废弃方法列表的指针struct objc_method_list *obsolete,还有方法的个数int method_count,还有一个用于存储方法的数组struct objc_method method_list[1]。其中数组的长度是可变的。

看一下objc_method这个结构体,

SEL method_name表示方法名,char *method_types表示参数及返回值类型,IMP method_imp表示指向方法实现的指针。

导入:

协议方法的获取

类属性的获取

实例方法的获取

类方法的获取

方法交换 method swizzled

4. ios中怎么在外部调用私有方法

因为method2在编译器处理到method1的时候还没有被声明,因此编译器在method1里并不知道method2的存在。新的LLVM已经改进了这个问题
解决方案:
1. 更新你的开发环境到最新的Xcode。
2. 写一个Class Extension,把方法声明在Class Extension里。

5. ios类方法中怎么调用实例方法

实例方法是建立实例才有的方法类方法是直接可以使用类引用,不需要实例化就可以使用的方法,一般在项目中类方法都是设置为工具类使用的

阅读全文

与ios如何调用方法相关的资料

热点内容
2021年智慧树教育科学研究方法试题答案 浏览:704
测量铺贴瓷砖平整度的正确方法 浏览:360
如何确定齿轮的制造方法 浏览:609
公路涵洞测量方法 浏览:638
对数方程最简单的方法 浏览:85
导泄作用的研究方法 浏览:92
生态建设的方法有哪些 浏览:570
职位评价技巧和方法 浏览:301
有治疗近视的方法吗 浏览:745
虫草花的最佳食用方法煲汤 浏览:374
宝鸡扶风种植方法 浏览:676
目前术后疼痛临床最常用的方法 浏览:967
衣柜空心横杆的正确安装方法 浏览:847
梨花烫的制作方法视频 浏览:659
人参的鉴别方法和原理 浏览:251
红米6手机麦克风权限在哪里设置方法 浏览:452
失眠晚上耳鸣最好的治疗方法 浏览:271
测定hiv的最简便方法是选择题 浏览:742
elf冰淇淋妆前膏怎么使用方法 浏览:686
炸鸡架子的方法和步骤 浏览:152