ios笔记

来源:互联网 发布:fc2视频域名更改 编辑:程序博客网 时间:2024/05/16 09:59

引用计数器:

 1.方法的基本使用
 1> retain :计数器+1,会返回对象本身
 2> release :计数器-1,没有返回值
 3> retainCount :获取当前的计数器
 4> dealloc
  * 当一个对象要被回收的时候,就会调用
  * 一定要调用[super dealloc],这句调用要放在最后面
 2.概念
 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

多个对象之间的内存管理:

 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
 2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)
 3.谁retain,谁release
 4.谁alloc,谁release 

内存管理规范:

内存管理代码规范: 1.只要调用了alloc,必须有release(autorelease)   对象不是通过alloc产生的,就不需要release  2.set方法的代码规范 1> 基本数据类型:直接复制 - (void)setAge:(int)age {     _age = age; }  2> OC对象类型 - (void)setCar:(Car *)car {    // 1.先判断是不是新传进来对象    if ( car != _car )    {        // 2.对旧对象做一次release        [_car release];         // 3.对新对象做一次retain        _car = [car retain];    } }  3.dealloc方法的代码规范 1> 一定要[super dealloc],而且放到最后面 2> 对self(当前)所拥有的其他对象做一次release - (void)dealloc {    [_car release];    [super dealloc]; }
/* 1.set方法内存管理相关的参数 * retain : release旧值,retain新值(适用于OC对象类型) * assign : 直接赋值(默认,适用于非OC对象类型) * copy   : release旧值,copy新值  2.是否要生成set方法 * readwrite : 同时生成setter和getter的声明、实现(默认) * readonly  : 只会生成getter的声明、实现  3.多线程管理 * nonatomic : 性能高 (一般就用这个) * atomic    : 性能低(默认)  4.setter和getter方法的名称 * setter : 决定了set方法的名称,一定要有个冒号 : * getter : 决定了get方法的名称(一般用在BOOL类型) */




 分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法
 使用注意:
 1.分类只能增加方法,不能增加成员变量
 2.分类方法实现中可以访问原来类中声明的成员变量
 3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
 4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类  --> 父类

SEL关键字:

 SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法
 其实消息就是SEL

@class及循环引用

 1.@class的作用:仅仅告诉编译器,某个名称是一个类 @class Person; // 仅仅告诉编译器,Person是一个类  2.开发中引用一个类的规范 1> 在.h文件中用@class来声明类 2> 在.m文件中用#import来包含类的所有东西  3.两端循环引用解决方案 1> 一端用retain 2> 一端用assign 

autorelease:

/* 1.set方法内存管理相关的参数 * retain : release旧值,retain新值(适用于OC对象类型) * assign : 直接赋值(默认,适用于非OC对象类型) * copy   : release旧值,copy新值  2.是否要生成set方法 * readwrite : 同时生成setter和getter的声明、实现(默认) * readonly  : 只会生成getter的声明、实现  3.多线程管理 * nonatomic : 性能高 (一般就用这个) * atomic    : 性能低(默认)  4.setter和getter方法的名称 * setter : 决定了set方法的名称,一定要有个冒号 : * getter : 决定了get方法的名称(一般用在BOOL类型) */

Arc的基本使用:

    •    基本简介    •    ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切    •    ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化    •    基本原理    •    规则ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中    •    强指针和弱指针    •    默认所有实例变量和局部变量都是Strong指针    •    弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误 ARC的判断准则:只要没有强指针指向对象,就会释放对 1.ARC特点 1> 不允许调用release、retain、retainCount 2> 允许重写dealloc,但是不允许调用[super dealloc] 3> @property的参数  * strong :成员变量是强指针(适用于OC对象类型)  * weak :成员变量是弱指针(适用于OC对象类型)  * assign : 适用于非OC对象类型 4> 以前的retain改为用strong  指针分2种: 1> 强指针:默认情况下,所有的指针都是强指针 __strong 2> 弱指针:__weak/* 当两端循环引用的时候,解决方案: 1> ARC 1端用strong,另1端用weak  2> 非ARC 1端用retain,另1端用assign */

block相关:

 block要掌握的东西 1> 如何定义block变量 int (^sumBlock)(int, int); void (^myBlock)();  2> 如何利用block封装代码 ^(int a, int b) {    return a - b; };  ^() {    NSLog(@"----------"); };  ^ {    NSLog(@"----------"); };  3> block访问外面变量 * block内部可以访问外面的变量 * 默认情况下,block内部不能修改外面的局部变量 * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改  4> 利用typedef定义block类型 typedef int (^MyBlock)(int, int); // 以后就可以利用MyBlock这种类型来定义block变量 MyBlock block; MyBlock b1, b2;  b1 = ^(int a, int b) {    return a - b; };  MyBlock b3 = ^(int a, int b) {    return a - b; };

协议:

1.协议的定义 @protocol 协议名称 <NSObject>  // 方法声明列表.... @end   2.如何遵守协议 1> 类遵守协议 @interface 类名 : 父类名 <协议名称1, 协议名称2>  @end  2> 协议遵守协议 @protocol 协议名称 <其他协议名称1, 其他协议名称2>  @end  3.协议中方法声明的关键字 1> @required (默认)   要求实现,如果没有实现,会发出警告  2> @optional   不要求实现,怎样不会有警告  4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议 类名<协议名称> *变量名; id<协议名称> 变量名; NSObject<MyProtocol> *obj; id<MyProtocol> obj2;  如果没有遵守对应的协议,编译器会警告  5.@property中声明的属性也可用做一个遵守协议的限制 @property (nonatomic, strong) 类名<协议名称> *属性名; @property (nonatomic, strong) id<协议名称> 属性名; @property (nonatomic, strong) Dog<MyProtocol> *dog; @property (nonatomic, strong) id<MyProtocol> dog2;  6.协议可用定义在单独.h文件中,也可用定义在某个类中 1> 如果这个协议只用在某个类中,应该把协议定义在该类中  2> 如果这个协议用在很多类中,就应该定义在单独文件中  7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中 1> 一般情况下,都是定义在单独文件 2> 定义在原来类中的分类,只要求能看懂语法


UIKiet部分:

1.IBAction:
1> 能保证方法可以连线
2> 相当于void

2.IBOutlet:
1> 能保证属性可以连线

3.常见错误
setValue:forUndefinedKey:]: this class is not key value coding
错误原因是:连线出问题了

4.Xcode5开始的一些建议
把用于连线的一些方法和属性声明在.m文件的类扩展中

5.frame\center\bounds
1> frame:能修改位置和尺寸(以父控件的左上角为坐标原点)
2> center:能修改位置(以父控件的左上角为坐标原点)
3> bounds:能修改尺寸(x\y一般都是0)(以自己的左上角为坐标原点)

3>transform:能控制view形状(旋转,缩放)


用xib封装一个自定义的view步骤:

1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView)2> 新建一个MJAppView.xib文件来描述MJAppView内部的结构3> 修改UIView的类型为MJAppView真是类型4> 将内部的子控件跟MJAppView进行属性连线5> MJAppView提供一个模型属性6> 重写模型属性的set方法,因为在set方法中可以拿到外界传递的模型数据7> 把模型数据拆开,分别设置数据到对应的子控件中8> 补充:提供一个创建MJAppView的类方法,将读取xib文件的代码屏蔽起来

如何控制状态栏?

io7状态栏默认情况下归控制器管理,比如状态栏的样式、状态栏的是否可见

控制器通过重写以下方法来控制状态栏

设置状态栏的样式(UIStatusBarStyle)preferredStatusBarStyle;其中UIStatusBarStyleLightContent是白色样式设置状态栏的可见性- (BOOL)prefersStatusBarHidden;

应用程序图标:

只要文件名叫做Icon.png,就会自动被当做是应用程序的图标
一个应用程序可以准备多种规格的图标,详情可以查看苹果官方文档

应用程序启动图片:

一个app在启动过程中会全屏显示叫做Default.png的图片
不用规格Default的使用场合
Default.png:非retina-iPhone屏幕,320x480
Default@2x.png:retina-iPhone屏幕,640x960
Default-568h@2x.png:4inch的retina-iPhone屏幕,640x1136
Default-Portrait~ipad.png:非retain-iPad竖屏屏幕,768x1024
Default-Portrait~ipad@2x.png:retain-iPad竖屏屏幕,1536x2048
Default-Landscape~ipad.png:非retain-iPad横屏屏幕,1024x768
Default-Landscape~ipad@2x.png:retain-iPad横屏屏幕,2048x1536

UIButton状态:

UIButton有很多种状态,它提供了一些便捷属性,可以直接获取当前状态下的文字、文字颜色、图片等
@property(nonatomic,readonly,retain) NSString *currentTitle;
@property(nonatomic,readonly,retain) UIColor  *currentTitleColor;        
@property(nonatomic,readonly,retain) UIImage  *currentImage;             
@property(nonatomic,readonly,retain) UIImage  *currentBackgroundImage;

UIScrollView:

</pre><pre name="code" class="java">代理方法:// 用户开始拖拽时调用- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;// 滚动到某个位置时调用- (void)scrollViewDidScroll:(UIScrollView *)scrollView;// 用户结束拖拽时调用- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;常见属性:@property(nonatomic) CGPoint contentOffset; 这个属性用来表示UIScrollView滚动的位置@property(nonatomic) CGSize contentSize; 这个属性用来表示UIScrollView内容的尺寸,滚动范围(能滚多远)@property(nonatomic) UIEdgeInsets contentInset; 这个属性能够在UIScrollView的4周增加额外的滚动区域

UITableView:

UItableView有两种样式:UITableViewStylePlain,UITableViewStyleGrouped

UITableViewDataSource协议相关方法:

// 一共有多少组数据- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;// 每一组有多少行数据- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;// 每一行显示什么内容- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

UITableViewCell:
UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图,

contentView下默认有3个子视图,其中2个是UILabel(通过UITableViewCell的textLabel和detailTextLabel属性访问).第3个是UIImageView(通过UITableViewCell的imageView属性访问);UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置

UITableViewCellStyle有四种样式:UITableViewCellStyleDefault,UITableViewCellStyleSubtitle,UITableViewCellStyleValue1,UITableViewCellStyleValue2

UItableViewCell重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
UItableViewCell重用方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    // 1.定义一个cell的标识      static NSString *ID = @"mjcell";    // 2.从缓存池中取出cell      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];    // 3.如果缓存池中没有cell      if (cell == nil) {        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];    }    // 4.设置cell的属性...      return cell;}

程序的启动原理:

UIApplication的常用属性:

设置应用程序图标右上角的红色提醒数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
设置联网指示器的可见性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;

UIApplication有个功能十分强大的openURL:方法
- (BOOL)openURL:(NSURL*)url;
openURL:方法的部分功能有
打电话
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];
发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];
发邮件
[app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];
打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];
打开其他app程序

IOS控制器管理:

IOS数据的存取:

Quartz2D:

ios多线程:










0 0