1> #import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次?
2> @class仅仅是声明一个类名,并不会包含类的完声明;@class还能解决循环包含的问题
3> #import <> 用来包含自带的文件,#import “”用来包含自定义的文件
1> readwrite:同时生成get方法和set方法的声明和实现
2> readonly:只生成get方法的声明和实现
3> assign:set方法的实现是直接赋值,用于基本数据类型
4> retain:set方法的实现是release旧值,retain新值,用于oc对象类型
5> copy:set方法的实现是release旧值,copy新值,用于nsstring、block等类型
6> nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)
1> @property (nonatomic, retain) nsstring *name;
- (void)setname:(nsstring *)name
{
if(_name != name) {
[_namerelease];
_name= [name retain];
}
}
2> @property(nonatomic, copy) nsstring *name;
- (void)setname:(nsstring *)name
{
if(_name != name) {
[_namerelease];
_name= [name copy];
}
}
1> 编译时是nsstring类型
2> 运行时是nsdata类型
1>常用oc类型:nsstring、nsarray、nsdictionary、nsdata、nsnumber等
2>oc对象需要手动管理内存,c的基本数据类型不需要管理内存
id声明的变量能指向任何oc对象
1>每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁
2>通过retain可以让对象的计数器+1、release可以让对象的计数器-1
3>还可以通过autorelease pool管理内存
4>如果用arc,编译器会自动生成管理内存的代码
1> 只要调用了alloc、copy、new方法产生了一个新对象,都必须在最后调用一次release或者autorelease
2> 只要调用了retain,都必须在最后调用一次release或者autorelease
3> @property如果用了copy或者retian,就需要对不再使用的属性做一次release操作
4> 如果用了arc,另外讨论
nsmutablearray*ary=[[nsmutablearrayarray]retain];
nsstring*str=[nsstringstringwithformat:@"test"];// 1
[str retain];// 2
[ary addobject:str]; // 3
nslog(@"%d", [strretaincount]);
[str retain];//4
[str release];// 3
[str release];// 2
nslog(@"%d", [strretaincount]);
[ary removeallobjects];// 1
nslog(@"%d", [strretaincount]);
结果:3、2、1
1>创建线程的方法
? nsthread
? nsoperationqueue和nsoperation
? gcd
2>主线程中执行代码
? [self performselectoronmainthread: withobject: waituntildone:];
? [self performselector: onthread:[nsthread mainthread] withobject:waituntildone:];
? dispatch_async(dispatch_get_main_queue(), ^{
});
3>延时执行
? double delayinseconds = 2.0;
dispatch_time_t poptime =dispatch_time(dispatch_time_now,
(int64_t)(delayinseconds * nsec_per_sec));
dispatch_after(poptime,dispatch_get_main_queue(), ^(void){
});
? [self performselector: withobject: afterdelay:];
? [nstimer scheduledtimerwithtimeinterval: target: selector: userinfo:repeats:];
警告:一定要把英文题目过一遍,有些公司的题目故意弄成英文的!!!
1>浅拷贝:指针(地址)拷贝,不会产生新对象
2>深拷贝:内容拷贝,会产生新对象
1>分类可以在不修改原来类模型的基础上拓充方法
2>分类只能扩充方法、不能扩充成员变量;继承可以扩充方法和成员变量
3>继承会产生新的类
1>分类是有名称的,类扩展没有名称
2>分类只能扩充方法、不能扩充成员变量;类扩展可以扩充方法和成员变量
3>类扩展一般就写在.m文件中,用来扩充私有的方法和成员变量(属性)
1> java的接口中声明的方法必须都实现
2> oc的protocol中声明的方法并不一定要实现
1> kvc是键值编码,可以通过一个字符串的key(属性名)修改对象的属性值
2> kvo是键值监听,可以监听一个对象属性值的改变
1>两个对象之间传递数据和消息
2>解耦,拆分业务逻辑
1> mutable是可变类型,比如nsmutablearray,可以动态往里面添加元素
2> immutable是不可变类型,比如nsarray,固定的存储空间,不能添加元素
1>动态绑定:对象类型在运行时才真正确定
2>多态性
1>通过nsnotification可以给多个对象传递数据和消息
2>通过protocol(代理模式)只能给一个对象传递数据和消息
1>本地推送:程序内部弹出通知到用户设备
2>远程推送:由推送服务器推送通知到用户设备
多态:父类指针指向子类对象
单粒:保证程序运行过程中,永远只有一个对象实例
目的是:全局共享一份资源、节省不必要的内存开销
响应者链:
l uiresponder有一个nextresponder属性,通过该属性可以组成一个响应者链,事件或消息在其路径上进行传递
l 如果uiresponder没有处理传给它的事件,会将未处理的消息转发给自己的nextresponder
1> frame以父控件的左上角为坐标原点
2> bounds以控件本身的左上角为坐标原点
通过一个selector可以找到方法地址,进而调用一个方法
1> oc 1.0没有垃圾回收
2> oc 2.0有垃圾回收,只能用在mac上
3> ios中有arc机制,是编译器特性,垃圾回收是运行时特性
1>用来存放nsoperation对象的队列,可以用来异步执行一些操作
2>一般可以用在网络请求等耗时操作
延迟加载:比如控制器的view,在第一次用到view时才会调用loadview方法进行创建
从技术角度上分析,一个控制器内部添加2个表格控制器是没有问题的
从对象属性上分析,tableview只有一个datasource属性。当然,真要使用2个不同的数据源,还是有其他办法解决的
1>当数组元素需要动态地添加或者删除时,用nsmutablearray
2>当数组元素固定不变时,用nsarray
1>代理方法:返回tableview每行的高度、监听tableview每行的选中
2>数据源方法:返回tableview数据的组数和行数、每行显示什么数据
没有限制
系统会默认会不定时地创建和销毁自动释放池
当需要精确地控制对象的释放时间时,需要手动创建自动释放池
当做一次retain或者copy操作,都有可能增加计数器
nsobject常见的类方法有:alloc、new、description等
像nsstirng的stringwithformat,nsnumber的numberwithint
1> 创建项目时,device选择universal
2> 可以创建一套痛用的数据模型
3> 根据iphone\ipad选择不同的控制器(ipad可能用uisplitviewcontroller)
4> 根据iphone\ipad选择不同的界面
1> atomic是原子性
2> atomic会对set方法的实现进行加锁
uiview封装的核心动画可以通过类方法\block实现
1>属性列表
2>preference(nsuserdefaults)
3>键值归档(nskeyedarchiver、nscoding)
4>sqlite
5>core data
nsmanagedobject是core data中的实体对象
谓词:可以以一定条件来过滤数组、字典等集合数据,也能用在core data的数据查询中
1> oc是单继承,没有多继承
2> 有时可以用分类和协议来代替多继承
1> oc没有类似@private的修饰词来修饰方法,只要写在.h文件中,就是公共方法
2> 可以直接在.m文件中(比如类扩展)声明和实现方法,对编译器来说是私有的
const int a;
int const a;
const int *a;
int const *a;
int * const a;
int const * const a;
1> 前两个的作用是一样:a 是一个常整型数
2> 第三、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针可以)
3> 第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)
4> 最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)
1> static修饰的函数是一个内部函数,只能在本文件中调用,其他文件不能调用
2> static修饰的全部变量是一个内部变量,只能在本文件中使用,其他文件不能使用
3> static修饰的局部变量只会初始化一次,并且在程序退出时才会回收内存
1>一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间
2>要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务
3>一个进程中允许开启多条线程,也就是同时执行多个任务
1>堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存
2>栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存
1> tableview的代理一般都是它所属的控制器,控制器会对它内部的view做一次retain操作
2> 假设tableview也对代理(控制器)做一次retain操作,那么就出现循环retain问题
1> copy:nsstring、block等类型
2> assign:基本数据类型
3> retain:oc对象类型
每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁
这里只是简述:将离开屏幕的cell放到缓存池,重新拿来显示到屏幕的其他位置(其他自己详细描述)
1> loadview
? 当第一次使用控制器的view时,会调用loadview方法创建view
? 一般在这里自定义view
2> viewdidload
? 当控制器的view创建完毕时会调用,也就是在loadview后调用
? 一般在这里添加子控件、初始化数据
3> viewdidunload
? 当控制器的view因为内存警告被销毁时调用
? 一般在这里回收跟界面相关的资源(界面都会销毁了,跟界面相关的资源肯定不要了)
? 当应用程序接收到系统的内容警告时,就有可能调用控制器的didrece…warning方法
? 它的默认做法是:
l 当控制器的view不在窗口上显示时,就会直接销毁,并且调用viewdidunload方法
1> m:model,模型,封装数据
2> v:view,视图界面,负责展示数据
3> c:controller,控制器,负责提供数据(model)给界面(view)
1> self.是调用get方法或者set放
2> self是当前本身,是一个指向当前对象的指针
3> self->是直接访问成员变量
1> id类型的指针可以指向任何oc对象
2> nil代表空值(空指针的值)
timer profile
如对本文有疑问, 点击进行留言回复!!
iOS开发——AVPlayer自定义播放器(持续更新,学习中)
Codeforces Round #659 (Div. 2) C、String Transformation 1(思维+set)
网友评论