IOS6学习笔记(一)
一.ARC
1.ARC环境下可以使用-(void)dealloc{};处理一些事情(比如移除KVO观察),但不要调用[super dealloc];
2.ARC与非ARC混编要注意符合Cocoa命名约定,比如不能用copyRight这样的方法名,需改成copyright。或使用NS_RETURNS_RETAINED或NS_RETURNS_NOT_RETAINED告诉编译器使用哪种内存管理规则,这些修饰符在NSObjCRuntime.h中定义的。
3.readonlyString在类扩展部分被重新定义时使用readwrite关键字进行修饰,这样一来便为该属性创建了一个私有的设置方法(setter)。
@interface ViewController : UIViewController
@property (nonatomic, readonly, strong) NSString *readonlyString;
@end
@interfaceViewController ()
@property (nonatomic, readwrite, strong) NSString *readonlyString;
@end
二.属性
1.原子性(atomic),LLVM4中加入了该特性。它本意指属性的存取方法是线程安全的。比如,声明了一个MSMutableArray类型的原子属性stuff,这种情况下self.stuff和self.stuff=otherStuff都是线程安全的。但是,使用objectAtIndex:方法访问数组并不是线程安全的,需要用锁来保证线程安全。下面的代码简单表示了atomic的实现:
[_propertyLock lock];
id result = [[value retain] autorelease];
[_propertyLock unlock];
return result;
2.copy,对于非可变类(比如NSString、NSArray)的属性通常应该使用copy修饰。用于声明属性的类可能会拥有可变的子类,比如NSString就可能有一个可变的子类NSMutableString,能够把NSMutableString对象赋给NSString属性,这种情况下你的属性所指向的对象就有可能被其他调用者改变。
@property (nonatomic, copy) NSMutableString *strongStr;
NSMutableString *mString = [[NSMutableStringalloc] initWithFormat:@"mutableString"];
self.strongStr = mString;
NSLog(@"self.strongStr:%@",self.strongStr);
NSLog(@"mString’p:%p",mString);
NSLog(@"self.strongStr’p:%p",self.strongStr);
[mString appendString:@"."];
NSLog(@"self.strongStr:%@",self.strongStr);
NSLog(@"mString’p:%p",mString);
NSLog(@"self.strongStr:%p",self.strongStr);
输出:
2013-06-21 18:08:50.954 PropertyTest[7467:907] self.strongStr:mutableString
2013-06-21 18:08:50.957 PropertyTest[7467:907] mString’p:0x1f592bb0
2013-06-21 18:08:50.959 PropertyTest[7467:907] self.strongStr’p:0x1f592d30
2013-06-21 18:08:50.960 PropertyTest[7467:907] self.strongStr:mutableString
2013-06-21 18:08:50.961 PropertyTest[7467:907] mString’p:0x1f592bb0
2013-06-21 18:08:50.962 PropertyTest[7467:907] self.strongStr’p:0x1f592d30
改为
@property (nonatomic, strong) NSMutableString *strongStr;
输出:
2013-06-21 18:12:35.615 PropertyTest[7505:907] self.strongStr:mutableString
2013-06-21 18:12:35.619 PropertyTest[7505:907] mString’p:0x1e5a7220
2013-06-21 18:12:35.620 PropertyTest[7505:907] self.strongStr’p:0x1e5a7220
2013-06-21 18:12:35.621 PropertyTest[7505:907] self.strongStr:mutableString.
2013-06-21 18:12:35.622 PropertyTest[7505:907] mString’p:0x1e5a7220
2013-06-21 18:12:35.623 PropertyTest[7505:907] self.strongStr:0x1e5a7220
三.+(void)load方法
在第一次加载分类的时候执行。load方法是运行时的一个特性,每一个分类都可以实现+load,所有的+load实现都会执行,但执行的顺序是无法保证的。还有,不要尝试手动调用+load。通常在main函数之前(在类被加载到运行时的时候)就被调用。
Foundation Tool示例代码
#import "LoadClass.h"
@implementation LoadClass
+ (void)load
{
NSLog(@"loading ");
}
@end
@implementation LoadClass (category)
+(void)load
{
NSLog(@"Category loading");
}
@end
@implementation LoadClassSubClass
+(void)load
{
NSLog(@"subClass loading");
}
@end
其输出为:
2013-06-24 13:48:42.484 PropertyTest[1340:c07] loading
2013-06-24 13:48:42.489 PropertyTest[1340:c07] subClass loading
2013-06-24 13:48:42.491 PropertyTest[1340:c07] Category loading
+(void)initialize方法
+initialize方法与其他类方法机制相同,这意味着Category中的+initialize方法会覆盖类本身的+initialize方法。而另一个后果就是,如果父类中实现了+initialize方法,而子类中没有重写此方法,则子类初始化时就会使用父类的方法。这与“每个类(所有父类和子类)只会执行一次+initialize方法”并不冲突,因为第二次调用父类的+initialize方法是对子类执行,但使用的是同一个方法实现而已。
#import
@interface Abstract : NSObject
@end
@implementation Abstract
+ (void)initialize
{
NSLog(@"%@ initialize",self);
}
@end
@interface Sub : Abstract
@end
@implementation Sub
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"main Start");
[Sub class];
NSLog(@"Hello, World!");
}
return 0;
}
其输出为:
main Start
Abstract initialize
Sub initialize
Hello, World!
如果不想子类使用父类的+initialize方法,则父类的+initialize方法可以这样写
+ (void)initialize
{
if(self == [WhateverClass class])
{
...perform initialization...
}
}
另外一些,不能这样写的情形有:
- 需要在每个子类初始化时执行相同的+initialize方法,比如使用+initialize记录每个继承子类的名字。
- 使用KVO通知的情况,KVO机制的实现机制是创建动态子类(creates dynamic subclasses),如果使用上述代码包含,则在动态创建的子类中则不会调用+initialize实现。
IOS6学习笔记(一)的更多相关文章
- IOS6学习笔记(四)
1.GCD设置一个timer计时器 - (void)awakeFromNib { __weak id weakSelf = self; double delayInSeconds = 0.25; _t ...
- IOS6学习笔记(三)
1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的.这意味着像下面这样的声明使用ARC编译后指向的是空值(nil): NSObject *myObject1,*myO ...
- IOS6学习笔记(二)
四.使用关联引用为分类添加数据 虽然不能在分类中创建实例变量,但是可以创建关联引用(associative reference).通过关联引用,你可以向任何对象中添加键-值(key-value)数据. ...
- iOS学习笔记20-地图(二)MapKit框架
一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...
- IOS学习笔记37——ViewController生命周期详解
在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- Ubuntu中QT使用FFmpeg的奇怪问题
FFmpeg都已经编译安装好了,QT的程序中调用av_register_all却总是在链接阶段报错,经过长时间的摸索,发现时静态链接库的问题,网上给出的答案都只能解决部分问题,所需的全部链接库如下: ...
- 引入HBase依赖包带来的麻烦
在一个项目里用到HBase做底层存储,使用maven来管理相关Jar包依赖,用maven来管理依赖包,特别不爽的就是他会将你引入Jar包自己的依赖都搞进来,经常会出现一些类和方法冲突找不到等状况.这次 ...
- JAVA多线程编程之生产者消费者模式
Java中有一个BlockingQueue可以用来充当堵塞队列,下面是一个桌面搜索的设计 package net.jcip.examples; import java.io.File; import ...
- IIS7下配置SSAS通过HTTP远程连接
淘宝 问答 学院 博客 资源下载 高端培训 登录 注册 全部问题 文章 话题 人物 ...
- C# 通过WebService方式 IIS发布网站 上传文件到服务器
应用场景:要将本地的文件 上传到服务器的虚拟机上 网络环境:公司局域网(如下图中第二种) 开发环境:VS2010 服务器环境:WinServer2008 虚拟机环境:WinServer2008 ...
- 【原创】C#搭建足球赛事资料库与预测平台(4) 比赛信息数据表设计
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...
- IIS 7完全攻略之日志记录配置(摘自网络)
IIS 7完全攻略之日志记录配置 作者:泉之源 [IT168 专稿]除了 Windows 提供的日志记录功能外,IIS 7.0 还可以提供其他日志记录功能.例如,可以选择日志文件格式并指定要记录的请求 ...
- 受限玻尔兹曼机(RBM)学习笔记(四)对数似然函数
去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...
- iOS-图片轮播-SDCycleSCrollView的使用
介绍: SDCycleScrollView 是一款非常强大的轮播图第三方. 轮播流畅,手滑流畅.使用方便.自定义简单. 可以更改pageControl. 一. Demo地址 https://pan.b ...
- Java魔法堂:注释和注释模板
一.注释 1. 注释类型 [a]. 单行注释 // 单行注释 String type = "单行注释"; [b]. 多行注释 /* * 多行注释 */ String type ...