ios专题 - OCUnit===

合集下载

oc基础方法运用

oc基础方法运用

oc基础方法运用OC(Objective-C)是一种面向对象的编程语言,广泛应用于iOS和Mac开发中。

在OC中,有许多基础的方法可以帮助开发者完成常见的任务。

下面将介绍一些常用的OC基础方法及其运用。

1.字符串操作方法:- `length`:获取字符串的长度。

- `substringToIndex:`:截取字符串的前N个字符。

- `substringFromIndex:`:截取字符串的后N个字符。

- `containsString:`:判断字符串中是否包含指定的子字符串。

- `stringByAppendingString:`:将两个字符串进行拼接。

运用示例:```objective-cNSString *subStr = [str substringToIndex:5];NSString *subStr2 = [str substringFromIndex:6];```2.数组操作方法:- `initWithObjects:count:`:通过给定的对象数组来创建一个数组。

- `count`:获取数组中的元素个数。

- `objectAtIndex:`:获取指定位置的数组元素。

- `addObject:`:将对象添加到数组的末尾。

- `insertObject:atIndex:`:将对象插入到指定位置。

运用示例:```objective-cNSInteger count = [array count];NSString *object = [array objectAtIndex:1];```3.字典操作方法:- `initWithObjectsAndKeys:`:通过给定的对象和键创建一个字典。

- `count`:获取字典中的键值对个数。

- `objectForKey:`:获取指定键对应的值。

- `setObject:forKey:`:将指定的值与键关联。

运用示例:```objective-cNSInteger count = [dictionary count];```4.网络请求方法:运用示例:```objective-cif (error)} else//处理返回的数据NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];}}];[dataTask resume];```以上是一些常用的OC基础方法及其运用,可以帮助开发者完成日常的编程任务。

IOS笔试题题目

IOS笔试题题目

1. delegate中的property使用以下哪个属性()A. assignB. retainC. copyD. Strong2. 关于Objective-C中属性的说明,以下错误的是()A.readwrite是可读可写特性,需要生成getter方法和setter方法B.readonly是只读特性,只有getter方法,没有setter方法C.assign是赋值属性,setter方法将传入参数赋值给实例变量D.retain表示持有特性,copy属性表示拷贝属性,都会建立一个相同的对象3. 下面对category描述不正确的是()A.category可以添加新的方法B.category可以删除修改之前的方法C.将类的实现分散到多个不同文件或多个不同框架中D.创建对私有方法的前向引用4. NSRunLoop的以下描述错误的是()A.Runloop并不是由系统自动控制的B.有3类对象可以被run loop监控:sources,timers,observersC.线程是默认启动run loop的D.NSTimer可手动添加到新建的NSRunLoop中5. 单例类NSNotificationCenter提供信息广播通知,它采用的是观察者模式的通知机制。

()A. 对B. 错6. 判断:从通讯录数据库查询联系人数据,可通过ABAddressBookCopyArrayOfAllPeople和ABAddressBookCopyPeopleWithName函数获得。

()A. 对B. 错7. NSURLConnection类的同步请求方法是()A.+ sendSynchronousRequest:returningResponse:error:B.–initWithRequest:delegate:C.–initWithRequest:delegate:startImmediately:8. genstrings命名的基本语法:genstrings [-a] [-q] [-o] sourcefile()A.对B.错9. 面哪些属于UITableViewDelegate协议的方法()A.tableView:cellForRowAtIndexPath:B.tableView:numberOfRowsInSection:C.tableView:didSelectRowAtIndexPath:D.numberOfSectionsInTableView:10. 平铺导航模式是在内容组织上没有层次关系,展示的内容都放置在一个主屏幕上,采用分屏或分页控制器进行导航,可以左右或者上下滑动屏幕查看内容()A.对B.错多选:1. UIPopoverController控制器的常用方法和属性()A.presentPopoverFromBarButtonItem:permittedArrowDirections:animated:呈现Popover视图方法B.dismissPopoverAnimated: 关闭Popover视图方法C.popoverVisible,判断Popover视图是否可见D.popoverArrowDirection,判断Popover视图箭头的方向2. 模态视图专用属性有哪些()A.UIModalPresentationFullScreen,全屏状态,是默认呈现样式,iPhone只能全屏呈现。

51CTO学院-iOS开发视频教程【进阶课程-iOS测试】

51CTO学院-iOS开发视频教程【进阶课程-iOS测试】

iOS开发视频教程【进阶课程-iOS测试】
课程目标
通过对本教程的学习,学员了解测试驱动的iOS开发,掌握测试驱动开发流程。

适用人群
iOS开发者
课程简介
iOS开发视频教程【进阶课程-iOS测试】
通过对本教程的学习,学员了解测试驱动的iOS开发,掌握测试驱动开发流程。

然后又介绍单元测试框架:OCUnit、GHUnit和OCMock。

其中OCUnit是Xcode自带单元测试框架,GHUnit是第三方提供的测试框架可以在模拟器和设备上测试。

OCMock为我们提供了单元测试需要的伪对象。

1
测试驱动的软件开发概述
[免费观看]
26分钟
测试驱动的软件开发概述
2
使用OCUnit测试框架
31分钟
使用OCUnit测试框架
3
使用GHUnit测试框架-添加GHUnit到工程
20分钟
使用GHUnit测试框架-添加GHUnit到工程
4
编写GHUnit测试用例-分析测试报告
12分钟
编写GHUnit测试用例-分析测试报告
5
使用伪对象
24分钟
使用伪对象
6
实战-iOS单元测试策略、测试数据持久层
19分钟
实战-iOS单元测试策略、测试数据持久层
7
实战-测试业务逻辑层
13分钟
实战-测试业务逻辑层
8
实战-测试表示层
35分钟
实战-测试表示层。

iOS面试题集锦(附答案)(个人精心整理)

iOS面试题集锦(附答案)(个人精心整理)

iOS⾯试题集锦(附答案)(个⼈精⼼整理)1、第三⽅库、masonry第三⽅⾃动布局是否⽤过,类⽅法和对象⽅法的区别2、MVC机制C对M:APIC对V:OutletV对C:T arget-action,Delegate,DatasourceM对C:Notification,KVO3、runtime机制runtime是⼀套⽐较底层的纯C语⾔API, 属于1个C语⾔库, 包含了很多底层的C语⾔API。

runtime ⽤来⼲什么呢??⽤在那些地⽅呢?怎么⽤呢?runtime是属于OC的底层, 可以进⾏⼀些⾮常底层的操作(⽤OC是⽆法现实的, 不好实现)在程序运⾏过程中, 动态创建⼀个类(⽐如KVO的底层实现)在程序运⾏过程中, 动态地为某个类添加属性\⽅法, 修改属性值\⽅法遍历⼀个类的所有成员变量(属性)\所有⽅法例如:我们需要对⼀个类的属性进⾏归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使⽤了runtime就可以动态设置!1>头⽂件利⽤头⽂件,我们可以查看到runtime中的各个⽅法!2>相关应⽤NSCoding(归档和解档, 利⽤runtime遍历模型对象的所有属性)字典–>模型(利⽤runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)KVO(利⽤runtime动态产⽣⼀个类)⽤于封装框架(想怎么改就怎么改)这就是我们runtime机制的只要运⽤⽅向3>相关函数objc_msgSend : 给对象发送消息class_copyMethodList : 遍历某个类所有的⽅法class_copyIvarList : 遍历某个类所有的成员变量class_…..这是我们学习runtime必须知道的函数!4.必备常识1> Ivar : 成员变量2> Method : 成员⽅法从上⾯例⼦中我们看到我们定义的成员变量,如果要是动态创建⽅法,可以使⽤Method,4、strong ,weak, assign有什么区别assign:简单赋值,不更改索引计数(Reference Counting)。

ios c语言调用oc方法

ios c语言调用oc方法

ios c语言调用oc方法iOS开发中,Objective-C是主要的编程语言,但是在一些特定的情况下,我们需要使用C语言来编写一些底层的代码。

在这种情况下,我们需要在C语言中调用Objective-C的方法。

下面是一些关于如何在C语言中调用Objective-C方法的方法。

1.使用Objective-C RuntimeObjective-C Runtime是Objective-C语言的核心部分,它提供了一些API来访问Objective-C对象和类。

我们可以使用Objective-C Runtime来在C语言中调用Objective-C方法。

首先,我们需要包含Objective-C Runtime的头文件:#include <objc/runtime.h>然后,我们可以使用以下代码来调用Objective-C方法:id object = ...; // Objective-C对象SEL selector = @selector(methodName); // 方法名IMP imp = [object methodForSelector:selector]; // 方法实现void (*func)(id, SEL) = (void (*)(id, SEL))imp; // 转换为函数指针func(object, selector); // 调用方法在这个例子中,我们首先获取Objective-C对象的方法实现,然后将其转换为函数指针,并最终调用该方法。

2.使用BlockBlock是Objective-C语言中的一种特殊的语法结构,它可以用来封装一段代码,并将其作为一个对象来传递。

我们可以使用Block来在C语言中调用Objective-C方法。

首先,我们需要定义一个Block类型,该类型接受一个Objective-C 对象和一个方法名作为参数,并返回void:typedef void (^MyBlock)(id, SEL);然后,我们可以使用以下代码来调用Objective-C方法:id object = ...; // Objective-C对象SEL selector = @selector(methodName); // 方法名MyBlock block = ^(id obj, SEL sel) {[obj performSelector:sel];};block(object, selector); // 调用方法在这个例子中,我们首先定义了一个Block类型,然后将Objective-C方法封装在Block中,并最终调用该Block来调用Objective-C方法。

IOS开发之基础oc语法

IOS开发之基础oc语法

IOS开发之基础oc语法类1.类的定义:类=属性+⽅法;-属性代表类的特征-⽅法是类能对变化做出的反应类定义的格式:类的声明和类的实现组成-接⼝(类的声明):@interface 类名:基类的名字.类名⾸字母要⼤写.冒号表⽰继承关系,冒号后⾯的是类的⽗类.NSObject是OC所有类的基类.类的声明放在“类名+.h”⽂件中,要由两部分组成:实例变量和⽅法-实现(类的实现):@implementation类名.⽅法实现-都⽤@end结束c2.类的使⽤:OC中,对象通过指针来声明如:ClassA *object;OC中对象的创建,使⽤alloc来创建⼀个对象,编译器会给object对象分配⼀块可⽤的内存地址,然后需要对对象进⾏初始化即调⽤init⽅法,这样这个对象才可以使⽤,如:Person *person=[Person alloc]; //创建对象分配空间person=[person init]; //初始化赋初值,初始化后:int=0,char=“*0”?,bool=FALSE同⼀个类的每个对象有不同的实例变量的存储空间同⼀类的每个对象共享该类的⽅法⽅法嵌套的形式来调⽤,如:ClassA *object=[[ClassA alloc] init];3.类的访问权限三种访问权限:-公有的:@public-私有的:@private-保护的:@protected属性默认的权限是保护的⽅法默认的权限是公有的4.⽅法定义⽆参⽆返: -(void)print;⽆参有返: -(Person *)register;有参⽆返: -(void)intuit:(int)newId;有参有返: -(Person *)init:(int)newId;带⼀个参数的⽅法-(Person *) init:(int) newID;带两个参数的⽅法:-(Person *) init:(int) newID:(int) newAge;“:”是⽅法名的⼀部分-第⼀个⽅法名:init-第⼆个⽅法名:init:-第三个⽅法名:init::多参数⽅法定义:-(Person *)initWithId:(int) newID andAge:(int) newAge andName:(NSString *)name;可以在⽅法名前⾯加任意标记如“WithId”,“andAge”,“andName”以此类推5.实例main:#import <Foundation/Foundation.h>#import "dog.h"int main(int argc, const char * argv[]) {@autoreleasepool {//创建对象,即实例化对象Dog *haShiQi=[[Dog alloc]init];//⽅法调⽤[haShiQi bark];//属性赋值haShiQi->health=120;haShiQi->name=@"哈⼠奇";NSLog(@"狗的姓名:%@,健康值%d",haShiQi->name,haShiQi->health);}return 0;}Dog.m:类的实现#import "Dog.h" //引⽤类的声明⽂件@implementation Dog//⽅法实现-(void)bark{NSLog(@"汪汪");}@endDog.h:类的声明#import <Foundation/Foundation.h>@interface Dog : NSObject //声明类Dog,继承根基类NSObject//类的属性{@public; //设置类的属性为公有(⼀般不允许使⽤)NSString *name;int health;}//对象⽅法-(void)bark;@end6.类⽅法和对象⽅法对⽐·对象⽅法(实例⽅法)-以减号“-”开头-只能让对象调⽤,没有对象,这个⽅法根本不可能被执⾏-对象⽅法能访问实例变量·类⽅法-以加号“+”开头-只能⽤类名调⽤,对象不能调⽤-类⽅法中不能访问实例变量(成员变量)-使⽤场合:当不需要访问成员变量的时候,尽量⽤类⽅法-类⽅法和对象⽅法可以同名7.属性的存取⽅法·获取属性值(getter)⽅法的定义-作⽤:返回对象内部的成员变量-命名规范:get⽅法的名称⼀般就跟成员变量同名·设置属性的值(setter)⽅法的定义-作⽤:⽤来设置成员变量,可以在⽅法⾥⾯过滤掉⼀些不合理的值-命名规范:-⽅法都是以set开头,⽽且后⾯跟上成员变量名,成员变量名的⾸字母必须⼤写-形参名称不要跟成员变量同名8.getter,setter⽅法实例main:#import <Foundation/Foundation.h>#import "dog.h"int main(int argc, const char * argv[]) {@autoreleasepool {//创建对象,即实例化对象Dog *haShiQi=[[Dog alloc]init];//⽅法调⽤[haShiQi bark];//属性赋值[haShiQi setName:@"哈⼠奇"]; //调⽤setter⽅法赋值[haShiQi setHealth:120];NSLog(@"狗的姓名:%@ 健康状况:%d",,haShiQi.health);}return 0;}Dog.m:类的实现#import "Dog.h" //引⽤类的声明⽂件@implementation Dog//⽅法实现-(void)bark{NSLog(@"汪汪");}//setter⽅法-(void)setName:(NSString *)newName{name=newName;}//getter⽅法-(NSString *)name{return name;}//setter⽅法-(void)setHealth:(int)newHealth{health=newHealth;}//getter⽅法-(int)health{return health;}@endDog.h:类的声明#import <Foundation/Foundation.h>@interface Dog : NSObject //声明类Dog,继承根基类NSObject//类的属性{NSString *name;int health;}//对象⽅法-(void)bark;-(void)setName:(NSString *)newName; //setter⽅法-(NSString *)name; //getter⽅法-(void)setHealth:(int)newHealth;-(int)health;@end9.⾃动⽣成属性的存取⽅法·@property语法·@synthesize·封装的好处:-过滤不合理的值-屏蔽内部的赋值过程-让外界不必关注内部的细节10.⾃动⽣成属性的存取⽅法实例main:#import <Foundation/Foundation.h>#import "dog.h"int main(int argc, const char * argv[]) {@autoreleasepool {//创建对象,即实例化对象Dog *haShiQi=[[Dog alloc]init];//⽅法调⽤[haShiQi bark];//属性赋值[haShiQi setName:@"哈⼠奇"];[haShiQi setHealth:120];NSLog(@"狗的姓名:%@ 健康状况:%d",,haShiQi.health); }return 0;}Dog.m:类的实现#import "Dog.h" //引⽤类的声明⽂件@implementation Dog//⽅法实现-(void)bark{NSLog(@"汪汪");}@synthesize name,health; //封装,代替了setter,getter@endDog.h:类的声明#import <Foundation/Foundation.h>@interface Dog : NSObject //声明类Dog,继承根基类NSObject//类的属性{@public; //设置类的属性为公有NSString *name;int health;}-(void)bark;@property int health; //封装,代替了setter,getter@property NSString *name;@end11.⽅法重载·OC中不是严格的函数重载命名冲突:-(int)doSomething(int)X;-(int)doSomething(float)X;命名冲突:-(int)doSomething(int)x:(int)y;-(int)doSomething(float)x:(int)y;不冲突:-(int)doSomething(int)x:(int)y;-(int)doSomething(int)x: andY:(float)y;因为⼀个是“doSomething:”,“另⼀个是doSomething::”12.继承·不改变原来模型的基础上,拓充⽅法·建⽴了类与类之间的联系·抽取了公共代码·减少冗余代码·坏处:耦合性强。

ios c语言调用oc方法

ios c语言调用oc方法

ios c语言调用oc方法在iOS开发中,我们经常需要在C语言代码中调用Objective-C 方法。

这种情况通常出现在使用一些第三方库或者需要优化性能的场景中。

以下是一些常用的方法。

1. 使用Objective-C++文件Objective-C++文件将Objective-C和C++代码混合在一起,可以在其中直接调用Objective-C方法。

假设我们已经有一个Objective-C类Foo,其中有一个方法bar:@interface Foo : NSObject- (void)bar;@end我们可以创建一个Objective-C++文件,将C++代码和Objective-C代码混合在一起:#ifdef __cplusplusextern 'C' {#endif#include 'foo.h'#ifdef __cplusplus}#endifvoid call_objc_method() {Foo *foo = [[Foo alloc] init];[foo bar];}在C代码中,我们只需要调用call_objc_method()函数即可调用Objective-C方法。

2. 使用Objective-C RuntimeObjective-C Runtime是Objective-C的运行时系统,提供了一系列C函数来操作Objective-C对象和类。

我们可以使用以下函数调用Objective-C方法:- objc_msgSend(id self, SEL op, ...)- objc_msgSendSuper(struct objc_super *super, SEL op, ...) - objc_msgSend_stret(void *stretAddr, id self, SELop, ...)- objc_msgSendSuper_stret(void *stretAddr, structobjc_super *super, SEL op, ...)这些函数的参数不同,但都包括要调用的对象和方法选择器。

iOS应用开发基础

iOS应用开发基础

iOS应用开发基础随着移动互联网的快速发展,手机成为人们必不可少的生活工具之一,iOS应用开发也日渐成为一个备受瞩目的领域。

本文将介绍iOS 应用开发的基础知识,涉及开发环境搭建、掌握Objective-C语言、UI设计、数据存储以及发布上架等方面。

一、iOS开发环境搭建iOS开发环境主要分为两个部分:开发工具和技术框架。

目前iOS 开发工具主要有Xcode,而技术框架则包括Cocoa Touch框架和Objective-C语言。

Xcode是苹果公司官方提供的开发工具,它可用于开发iOS、iPadOS、macOS、watchOS和tvOS等应用程序。

它是一个完整、集成的开发环境,能够提供代码编辑、编译、调试、性能调优、界面设计、应用分发等功能,是进行iOS应用开发的绝佳选择。

Objective-C是一种C语言的扩展,为iOS开发提供了强大的面向对象编程能力。

它是iOS开发的主要编程语言之一,在iOS开发中大量使用。

Cocoa Touch框架是iOS开发中的重要部分,它为iOS应用提供了许多核心功能,如界面设计、多媒体处理、网络通信等,是进行iOS 应用开发的主要技术框架之一。

二、掌握Objective-C语言Objective-C语言是许多iOS应用开发者必须掌握的语言之一。

它是C语言的扩展,有着完善的面向对象编程能力。

在iOS开发中,Objective-C用于处理界面事件、数据传输和应用逻辑等方面。

以下是Objective-C语言的基础语法:1.声明变量Objective-C语言中的变量声明采用了C语言的风格,变量名和数据类型中间加冒号“:”,基本数据类型包括整型、浮点型等。

int i;float f;NSString *str;2.分支与循环Objective-C中的分支和循环语句与C语言类似,可以使用if..else、for、while等语句。

if(condition) {//执行代码}for(int i=0;i<10;i++) {//执行代码}while(i<10) {//执行代码}3.函数Objective-C语言中的函数与C语言中的函数编写方式基本相同,有返回值类型和参数列表。

iOS程序开发之OC 常见指令详解

iOS程序开发之OC 常见指令详解

iOS程序开发之 OC 常见指令详解1. #import 和 #include 区别2. #pragma mark 指令的使用3. Copy 指令的使用1. #import 和 #include 区别#import 与 #include的类似,都是把其后面的文件拷贝到该指令所在的地方#import: 可以自动防止重复导入#import <>: 用于包含系统文件#import "": 用于包含本项目中的文件#import <Foundation/Foundation.h>,告诉编译器找到并处理名为 Foundation.h 文件,这是一个系统文件,#import 表示将该文件的信息导入到程序中。

框架地址:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneO S.sdk/System/Library/Frameworks/2. #pragma mark 指令的使用A. #pragma mark 功能简单来说就是对代码的分组, 方便代码查找和导航用的它告诉 Xcode 编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开。

一些类(尤其是一些控制器类)可能很长,方法和函数弹出菜单可以便于代码导航。

此时加入 #pragma 指令(#pragma 是一个编译指令)对代码进行逻辑组织很有效果。

一个类里我们总会有一些方法的功能与性质是相差不多的,你可能会有把方法们分组的想法。

Xcode 已经有了类似的支持,它就是 #pragma mark。

#pragma 是一个编译指令B. #pragma mark使用格式分组#pragma mark <分组(标识)名称>分隔线#pragma mark -分割线加分组#pragma mark - <分组(标识)名称>3. Copy 指令的使用1.copy 概念Copy 的字面意思是“复制”、“拷贝”,是一个产生副本的过程A. 文件复制利用一个源文件产生一个副本文件修改源文件的内容,不会影响副本文件修改副本文件的内容,不会影响源文件B. OC 中的 copy利用一个源对象产生一个副本对象修改源对象的属性和行为,不会影响副本对象修改副本对象的属性和行为,不会影响源对象2.Copy 的使用一个对象可以调用 copy 或 mutableCopy 方法来创建一个副本对象A. copy创建的是不可变副本(如 NSString、NSArray、NSDictionary)使用 copy 功能的前提:需要遵守 NSCopying 协议,实现 copyWithZone 方法@protocol NSCopying- (id)copyWithZone:(NSZone *)zone;@endB. mutableCopy创建的是可变副本(如 NSMutableString、NSMutableArray、NSMutableDictionary)使用 mutableCopy 的前提需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法@protocol NSMutableCopying- (id)mutableCopyWithZone:(NSZone *)zone;@endmutable: 英['mjuːtəb(ə)l], 美['mjutəbl], adj. 易变的,不定的;性情不定的3.深复制和浅复制只有源对象和副本对象都不可变时,才是浅复制,其它都是深复制A. 浅复制浅复制别名浅拷贝,指针拷贝,shallow copy源对象和副本对象是同一个对象源对象(副本对象)引用计数器+1,相当于做一次 retain 操作本质是:没有产生新的对象NSString *srcStr = @"lnj";NSString *copyStr = [srcStr copy];NSLog(@"src = %p, copy = %p", srcStr, copyStr);retain: 英[rɪ'teɪn], 美[rɪ'ten], vt. 保持;雇;记住B. 深复制(深拷贝,内容拷贝,deep copy)深复制别名深拷贝,内容拷贝,deep copy源对象和副本对象是不同的两个对象源对象引用计数器不变,副本对象计数器为1(因为是新产生的)本质是:产生了新的对象NSString *srcStr = @"lnj";NSMutableString *copyStr = [srcStr mutableCopy];NSLog(@"src = %p, copy = %p", srcStr, copyStr);NSLog(@"src = %@, copy = %@", srcStr, copyStr);[copyStr appendString:@" cool"];NSLog(@"src = %@, copy = %@", srcStr, copyStr);NSMutableString *srcStr = [NSMutableString stringWithFormat:@"lnj"]; NSString *copyStr = [srcStr copy];[srcStr appendString:@" cool"];NSLog(@"src = %p, copy = %p", srcStr, copyStr);NSLog(@"src = %@, copy = %@", srcStr, copyStr);NSMutableString *srcStr = [NSMutableString stringWithFormat:@"lnj"]; NSMutableString *copyStr = [srcStr mutableCopy];[srcStr appendString:@" cool"];[copyStr appendString:@" 520it"];NSLog(@"src = %p, copy = %p", srcStr, copyStr);NSLog(@"src = %@, copy = %@", srcStr, copyStr);。

ios专题—Ocunit

ios专题—Ocunit

OCUnit是集成在Xcode开发环境的单元测试框架;OCUnit运行必须包含SenTestingKit.framework这个库;针对需要测试的类,每个类写出自己的TestCase,独立组织一个文件。

每个测试类都是继承自SenTestCase类,这里有3个重要的方法需要介绍:1. -(void)setUp: 每个test方法执行前调用,用于类的创建,一些变量的初始化等2. -(void)tearDown:每个test方法执行后调用3. -(void)testXXX:这个是真正运行的测试方法,命名就是不带参数,以test开始。

这里的每个testXXX方法可以在Scheme里面看到,并可以设置是否测试这个方法开发者的主要工作是自己实现这些无返回值的testXXX方法,一般框架会提供大量的断言方法,如果还是觉得不够丰富,可以使用第三方的库来进行扩充,比如:OCHamcrest。

OCUnit断言介绍:1.无条件失败(Unconditional Failure)STFail让测试用例失败STFail(failure_description, ...)参数failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表2.相等测试(Equality Tests)STAssertEqualObjects当两个对象不同时,测试失败STAssertEqualObjects(object_1, object_2, failure_description, ...)参数object_1一个对象object_2一个对象failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当 [object_1 isEqualTo:object_2] 为false时,测试失败STAssertEquals当两个值不等的时候测试失败。

ios(OC部分)经典面试题大全

ios(OC部分)经典面试题大全

Objective_C 经典面试题一、简答题1、Objective-C的类可以多重继承么?可以采用多个协议么?不可以多重继承,可以采用多个协议.2、#import和#include的区别是什么?#import〈〉跟 #import"”有什么区别?#import能避免头文件被重复包含的问题:1。

一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include。

使用include要注意重复引用的问题:class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。

2. #import确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。

所以,#import比起#include的好处就是它避免了重复引用的问题.所以在OC中我们基本用的都是import.#import<> 包含iOS框架类库里的类,#import""包含项目里自定义的类。

3、Category是什么?扩展一个类的方式用继承好还是类目好?为什么?Category是类目。

用类目好,因为继承要满足a is a b的关系,而类目只需要满足a has a b的关系,局限性更小,你不用定义子类就能扩展一个类的功能,还能将类的定义分开放在不同的源文件里,用Category 去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系.4、延展是什么?作用是什么?延展(extension):在自己类的实现文件中添加类目来声明私有方法。

5、类实例(成员)变量的@protected ,@private,@public声明各有什么含义?@protected:受保护的,该实例变量只能在该类和其子类内访问,其他类内不能访问。

@private:私有的,该实例变量只能在该类内访问,其他类内不能访问。

@public:共有的,该实例变量谁都可以访问。

iOS开发——OC篇常用问题解答(一)

iOS开发——OC篇常用问题解答(一)

iOS开发——OC篇常⽤问题解答(⼀)常⽤问题解答1、设置 ImagePicker 的⼤⼩ImagePicker 在 Popover Controller 总是以默认⼤⼩显⽰,设置 popoverContentSize 属性似乎⽆⽤。

解决办法是将ImagePicker “包含”到⼀个定制的 ViewController 中,然后再presentPopover 这个 ViewController :UIViewController *containerController = [[UIViewController alloc] init];containerController.contentSizeForViewInPopover = CGSizeMake(600,self.view.frame.size.height);[containerController.viewaddSubview:_imagePicker.view];_popController= [[UIPopoverController alloc] initWithContentViewController:containerController];CGPoint p=[self.view convertPoint:button.centerfromView:sender.superview];[_popController presentPopoverFromRect:(CGRect){p,CGSizeZero}inView:self.viewpermittedArrowDirections:UIPopoverArrowDirectionAnyanimated:YES];[_imagePicker.view setFrame:containerController.view.frame];// 很重要注意,popover的宽度最多600。

ios class chain的语法

ios class chain的语法

ios class chain的语法概述:iOS Class Chain(类链)是一种用于访问iOS应用程序中视图层次结构的新语法。

它允许开发者根据视图的属性和位置来定位特定的UI 元素,从而简化了UI测试和自动化测试的编写过程。

Class Chain的语法:Class Chain使用层级关系和属性来定位UI元素,它的语法类似于XPath。

下面是一些常用的语法规则:1.使用 "->" 来表示层级关系,例如:"UIView->UILabel" 表示查找一个UILabel,它是一个UIView的子视图。

"UIView->UIButton" 表示查找一个UIButton,它是一个UIView的子视图。

2.使用 "." 来表示属性,例如:"UIView.text" 表示查找一个具有text属性的UIView。

"UILabel.text" 表示查找一个具有text属性的UILabel。

3.使用 "==" 来表示属性值,例如:"UIView.text=='Hello'" 表示查找具有text属性且值为"Hello"的UIView。

"UILabel.text=='Welcome'" 表示查找具有text属性且值为"Welcome"的UILabel。

4.使用 "contains" 来表示包含某个字符串,例如:"UIView.className.contains('Button')" 表示查找具有className属性值包含"Button"字符串的UIView。

5.使用 "regex" 来表示正则表达式匹配,例如:"UIView.className.regex('^Button.*$')" 表示查找className属性值以"Button"开头的UIView。

iOS培训之多线程编程:线程同步总结

iOS培训之多线程编程:线程同步总结

北京尚学堂提供1:原子操作- OSAtomic系列函数iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>。

不同线程如果通过原子操作函数对同一变量进行操作,可以保证一个线程的操作不会影响到其他线程内对此变量的操作,因为这些操作都是原子式的。

因为原子操作只能对内置类型进行操作,所以原子操作能够同步的线程只能位于同一个进程的地址空间内。

2:锁- NSLock系列对象iOS平台下的锁对象为NSLock对象,进入锁通过调用lock函数,解锁调用unlock函数(因为iOS中大部分的线程同步类都继承自NSLocking协议,所以其加锁/解锁的操作基本都为lock/unlock函数),同一个NSLock 对象成功调用lock函数后,在其显式unlock之前任何线程都不能再对此NSLock对象加锁,以达到互斥访问的目的。

除了lock函数,对NSLock加锁的函数还包括tryLock以及lockBeforeDate函数,lock函数在成功加锁之间会一直阻塞,而tryLock会尝试加锁,如果不成功,不会阻塞,而是直接返回NO,lockBeforeDate则是阻塞到传入的NSDate日期为止。

除了NSLock,iOS还提供了NSRecursive、NSConditionLock类型的锁类型。

NSRecursive与NSLock最大的区别就是NSRecursive是可重入的,也就是说一个线程可以对一个NSRecursive对象多次调用lock,只要解锁时调用相同次数的unlock函数便可。

NSConditionLock是一种带有条件的锁对象,除了基本的lock与unlock 函数,还提供了lockWithCondition以及unlockWithCondition,这两个函数接收整型类型的数据作为参数,只有当一个unlockWithCondition对象被调用时,对应的lockWithCondition才会正常返回。

iOS开发学习笔记(OC语言)——UIView和UIViewController生命周期

iOS开发学习笔记(OC语言)——UIView和UIViewController生命周期

iOS开发学习笔记(OC语⾔)——UIView和UIViewController⽣命周期UIView ⽣命周期#import "ViewController.h"@interface TestView: UIView@end@implementation TestView- (instancetype)init{self = [super init];if (self) {}return self;}- (void)willMoveToSuperview:(nullable UIView *)newSuperview {[super willMoveToSuperview:newSuperview];}- (void)didMoveToSuperview {[super didMoveToSuperview];}- (void)willMoveToWindow:(nullable UIWindow *)newWindow {[super willMoveToWindow:newWindow];}- (void)didMoveToWindow {[super didMoveToWindow];}@end@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.TestView *view = [[TestView alloc] init];view.backgroundColor = [UIColor redColor];view.frame = CGRectMake(100, 100, 100, 100);[self.view addSubview:view];}@end通过断点调试,可以发现⽣命周期是:1. init2. willMoveToSuperview3. didMoveToSuperview4. willMoveToWindow5. didMoveToWindowUIViewController ⽣命周期#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (instancetype)init {self = [super init];if (self) {}return self;}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view. UIView *view = [[UIView alloc] init];view.backgroundColor = [UIColor redColor];view.frame = CGRectMake(100, 100, 100, 100); [self.view addSubview:view];}- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];}- (void)viewDidDisappear:(BOOL)animated {[super viewDidDisappear:animated];}@end通过断点调试,可以发现⽣命周期是:1. init2. viewDidLoad3. viewDidAppear如果移除,顺序是:1. viewWillDisappear2. viewDidDisappear。

iOS开发-OC语言(一)oc数据类型

iOS开发-OC语言(一)oc数据类型

iOS开发-OC语⾔(⼀)oc数据类型分享⼀套以前学习iOS开发时学习整理的资料,后⾯整套持续更新:oc数据类型数据类型:基本数据类型、指针数据类型基本数据类型:数值型、字符型(char)、布尔型、空类型(void)指针数据类型:类(class)、id数值型:整数类型int、浮点型float、doublec和oc的基本数据类型int:声明整型变量double:声明双精度变量float:声明浮点型变量char:声明字符型变量id:通⽤的指针类型enum:声明枚举类型long:声明长整型变量或函数short:声明短整型变量或函数signed:声明有符号类型变量struct:声明结构体变量union:声明共⽤体(联合)数据类型unsigned:声明⽆符号类型变量void:声明函数⽆返回值或⽆参数数据类型格式化说明符数据类型 oc关键字格式说明引导符整型 int %d.%i短整型 short int %hd.%hi长类型 long int %ld.%li⽆符号短整型 unsigned int %u⽆短整型 unsigned short %hu⽆符号长整型 unsigned long %lu浮点型 float %f双精度型 double %f长双精度型 long double %lf字符型 char %c具体的数据类型整数类型oc中整数类型⽤int来表⽰,格式化符号⽤%i或%d来表⽰⽐如:int a=100;oc语⾔的整型常量默认为int型,声明long型常量可以后加“l”或“L”,如:int b=600;//long c=888888888L;类型占⽤存储空间值域范围Byte 1个字节 -128—127short 2个字节 -2′15—2′15-1int 4个字节 -2′31—2′31-1long 8个字节 -2′63—2′63-1注释:2‘63为2的63次⽅浮点类型浮点类型的变量可以存储包括⼩数的值oc中有两种浮点类型·float 有效数字为6-7位格式化说明符号⽤%f表⽰·double 有效数字为15-16位格式化说明符号⽤%f.%e或%g表⽰oc中浮点型常量默认为double型,如果要声明⼀个常量为float,在数字的后⾯加f或F例如:double m=3.14159;//正确 float f=3.14f;类型占⽤存储空间值域范围float 4字节 -3.403E38double 8字节 -1.798E308—1.798E字符串charchar型数据⽤来表⽰通常意义上的“字符”,格式化说明符⽤%c表⽰字符常量为⽤单引号括起来的单个字符,例如:char achar='a';char b='0';char cChar='苹';值域范围:-128—127"\n"、oc编译器把这个当做单个字符unsigned char 值域范围:0~255oc字符采⽤Unicode编码,每个字符占两个字节,因⽽可⽤⼗六进制编码形式表⽰,例如:char c1='\u0061';注:Unicode是全球语⾔统⼀编码逻辑型Boolean(布尔型)Boolean类型指的是⽤于存储真值和假值的变量,⼀般⽤于程序流程控制。

iOS开发零基础--Swift教程可选类型

iOS开发零基础--Swift教程可选类型

iOS开发零基础--Swift教程可选类型可选类型的介绍注意:可选类型时swift中较难理解的⼀个知识点暂时先了解,多利⽤Xcode的提⽰来使⽤随着学习的深⼊,慢慢理解其中的原理和好处概念:在OC开发中,如果⼀个变量暂停不使⽤,可以赋值为0(基本属性类型)或者赋值为空(对象类型)在swift开发中,nil也是⼀个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强类型语⾔)但是开发中赋值nil,在所难免.因此推出了可选类型可选类型的取值:空值有值定义可选类型定义⼀个可选类型有两种写法最基本的写法语法糖(常⽤)// 错误写法// let string : String = nil// 正确写法:// 注意:name的类型是⼀个可选类型,但是该可选类型中可以存放字符串.// 写法⼀:定义可选类型let name : Optional<String> = nil// 写法⼆:定义可选类型,语法糖(常⽤)let name : String? = nil可选类型的使⽤// 演练⼀:给可选类型赋值// 定义可选类型var string : Optional<String> = nil// 给可选类型赋值// 错误写法:因此该可选类型中只能存放字符串string = 123// 正确写法:string = "Hello world"// 打印结果print(string)// 结果:Optional("Hello world")\n// 因为打印出来的是可选类型,所有会带Optional// 演练⼆:取出可选类型的值// 取出可选类型的真实值(解包)print(string!)// 结果:Hello world\n// 注意:如果可选类型为nil,强制取出其中的值(解包),会出错string = nilprint(string!) // 报错// 正确写法:if string != nil {print(string!)}// 简单写法:为了让在if语句中可以⽅便使⽤string// 可选绑定if let str = string {print(str)}真实应⽤场景⽬的:让代码更加严谨// 通过该⽅法创建的URL,可能有值,也可能没有值.// 错误写法:如果返回值是nil时,就不能接收了// 如果字符串中有中⽂,则返回值为nil,因此该⽅法的返回值就是⼀个可选类型,⽽使⽤⼀个NSURL类型接收是错误的let url : NSURL = NSURL(string: "")// 正确写法:使⽤可选类型来接收let url : NSURL? = NSURL(string: "")// 该⽅式利⽤类型推导let url = NSURL(string: "")// 通过url来创建request对象:在使⽤可选类型前要先进⾏判断是否有值// 该语法成为可选绑定(如果url有值就解包赋值给tempURL,并且执⾏{}) if let tempUrl = url {let request = NSURLRequest(URL: tempUrl)}。

【iOSOC】互斥button的实现

【iOSOC】互斥button的实现

【iOSOC】互斥button的实现【iOSOC】互斥button的实现【iOS/OC】互斥button的实现在iOS开发中,经常会涉及到互斥button或者类似的场景,最近在看前端开发相关的技术,发现在前端中很难像OC中那样以⼀种很简洁的⼀式实现这⼀功能,故此记录⼀下:// 创建⼀个Button,所有button共享⼀个touch事件- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.for (int i = 0; i<7; i++) {UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];[self.view addSubview:btn];btn.frame = CGRectMake(10 + 55*i, 100, 50, 50);btn.backgroundColor = [UIColor redColor];[btn addTarget:self action:@selector(btnT ouch:) forControlEvents:UIControlEventTouchUpInside];}}// 在touch事件中,以⼀个static变量记录instance- (void)btnT ouch:(id)sender {static UIButton *lastBtn;UIButton *btn = (UIButton *)sender;if (lastBtn != btn) {btn.backgroundColor = [UIColor yellowColor];lastBtn.backgroundColor = [UIColor redColor];lastBtn = btn;}}思路⼀致为:1.所有button(在同⼀个互斥群⼀的所有button),共享⼀个touch事件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ios专题-OCUnitOCUnit是集成在Xcode开发环境的单元测试框架;OCUnit运行必须包含SenTestingKit.framework这个库;针对需要测试的类,每个类写出自己的TestCase,独立组织一个文件。

每个测试类都是继承自SenTestCase类,这里有3个重要的方法需要介绍:1. -(void)setUp: 每个test方法执行前调用,用于类的创建,一些变量的初始化等2. -(void)tearDown:每个test方法执行后调用3. -(void)testXXX:这个是真正运行的测试方法,命名就是不带参数,以test开始。

这里的每个testXXX方法可以在Scheme里面看到,并可以设置是否测试这个方法开发者的主要工作是自己实现这些无返回值的testXXX方法,一般框架会提供大量的断言方法,如果还是觉得不够丰富,可以使用第三方的库来进行扩充,比如:OCHamcrest。

OCUnit断言介绍:1.无条件失败(Unconditional Failure)STFail让测试用例失败STFail(failure_description, ...)参数failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表2.相等测试(Equality Tests)STAssertEqualObjects当两个对象不同时,测试失败STAssertEqualObjects(object_1, object_2, failure_description, ...)参数object_1一个对象object_2一个对象failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当 [object_1 isEqualTo:object_2] 为false时,测试失败STAssertEquals当两个值不等的时候测试失败。

STAssertEquals(value_1, value_2, failure_description, ...)参数value_1一个数值,结构体,或联合体。

value_2一个数值,结构体,或联合体。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当value_1 不等于value_2的时候测试失败。

STAssertEqualsWithAccuracy当两个值的差别大于给定值时,测试失败STAssertEqualsWithAccuracy(value_1, value_2, accuracy, failure_description, ...)参数value_1一个整型或浮点值。

value_2一个整型或浮点值。

accuracy一个整型或浮点值。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当value_1和value_2之间相差大于accuracy时,测试失败。

3.空值测试(Nil Tests)STAssertNilFails the test case when a given expression is not nil.如果给定的表达式不是nil,测试失败。

STAssertNil(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表STAssertNotNilFails the test case when a given expression is nil.当表达式为nil时,测试失败。

STAssertNotNil(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表4.布尔测试(Boolean Tests)STAssertTrue如果给定表达式为false,测试失败。

STAssertTrue(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表STAssertFalse如果给定表达式为true,测试失败。

STAssertFalse(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表5.异常测试(Exception Tests)STAssertThrows当表达式不抛异常时,测试失败STAssertThrows(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表STAssertThrowsSpecific当表达式不能抛出特定类的异常时,测试失败。

STAssertThrowsSpecific(expression, exception_class, failure_description, ...)参数expression要测试的表达式。

exception_class异常类failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当expression不会抛出exception_class的异常时,测试失败。

STAssertThrowsSpecificNamed当表达式不能抛出特定类指定名称的异常时,测试失败。

STAssertThrowsSpecificNamed(expression, exception_class, exception_name, failure_descript ion, ...)参数expression要测试的表达式。

exception_class异常类exception_name异常名字的字符串failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当expression不能抛出exception_class类中的名为exception_name的异常时,测试失败。

STAssertNoThrow如果表达式抛异常,测试失败。

STAssertNoThrow(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表STAssertNoThrowSpecific当表达式抛出特定类的异常时,测试失败。

STAssertNoThrowSpecific(expression, exception_class, failure_description, ...)expression要测试的表达式。

exception_class异常类failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当expression抛出exception_class的异常时,测试失败。

STAssertNoThrowSpecificNamed当表达式抛出特定类指定名称的异常时,测试失败。

STAssertNoThrowSpecificNamed(expression, exception_class, exception_name, failure_descrip tion, ...)参数expression要测试的表达式。

exception_class异常类exception_name异常名字的字符串failure_description指定你错误消息的格式化字符串,可以为nil...(可选)以逗号隔开的替换到failure_description的参数列表说明:当expression抛出exception_class类中的名为exception_name的异常时,测试失败。

STAssertTrueNoThrow当表达式为false或者抛异常时,测试失败。

STAssertTrueNoThrow(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil(可选)以逗号隔开的替换到failure_description的参数列表STAssertFalseNoThrow当表达式为true或者抛异常时,测试失败。

STAssertFalseNoThrow(expression, failure_description, ...)参数expression要测试的表达式。

failure_description指定你错误消息的格式化字符串,可以为nil。

相关文档
最新文档