一.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.strongStrmutableString

2013-06-21 18:08:50.957 PropertyTest[7467:907] mString’p0x1f592bb0

2013-06-21 18:08:50.959 PropertyTest[7467:907] self.strongStr’p0x1f592d30

2013-06-21 18:08:50.960 PropertyTest[7467:907] self.strongStrmutableString

2013-06-21 18:08:50.961 PropertyTest[7467:907] mString’p0x1f592bb0

2013-06-21 18:08:50.962 PropertyTest[7467:907] self.strongStr’p0x1f592d30

改为

@property (nonatomic, strong) NSMutableString *strongStr;

输出:

2013-06-21 18:12:35.615 PropertyTest[7505:907] self.strongStrmutableString

2013-06-21 18:12:35.619 PropertyTest[7505:907] mString’p0x1e5a7220

2013-06-21 18:12:35.620 PropertyTest[7505:907] self.strongStr’p0x1e5a7220

2013-06-21 18:12:35.621 PropertyTest[7505:907] self.strongStrmutableString.

2013-06-21 18:12:35.622 PropertyTest[7505:907] mString’p0x1e5a7220

2013-06-21 18:12:35.623 PropertyTest[7505:907] self.strongStr0x1e5a7220


三.+(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学习笔记(一)的更多相关文章

  1. IOS6学习笔记(四)

    1.GCD设置一个timer计时器 - (void)awakeFromNib { __weak id weakSelf = self; double delayInSeconds = 0.25; _t ...

  2. IOS6学习笔记(三)

    1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的.这意味着像下面这样的声明使用ARC编译后指向的是空值(nil): NSObject *myObject1,*myO ...

  3. IOS6学习笔记(二)

    四.使用关联引用为分类添加数据 虽然不能在分类中创建实例变量,但是可以创建关联引用(associative reference).通过关联引用,你可以向任何对象中添加键-值(key-value)数据. ...

  4. iOS学习笔记20-地图(二)MapKit框架

    一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...

  5. IOS学习笔记37——ViewController生命周期详解

    在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. CI 框架去掉url 中index.php的方法

    1 修改 apache 的 httpd.conf 文件 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的# 2 找到 你程序目录下的 .h ...

  2. [C++] memset 和sizeof 的使用注意

    因为使用C++写小题目时经常需要清除数组,这里记录下Memset函数的sizeof运算符的使用注意. memset的特点是:将给定地址后连续的内存(包括给定地址),逐个byte初始化为参数中指明的值. ...

  3. java框架篇---spring AOP 实现原理

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  4. asp.net 客户端上传文件全路径获取方法

    asp.net  获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他 ...

  5. 从头学Qt Quick(1) --体验快速构建动态效果界面

    自2005年Qt4发布以来,Qt已经为成千上万的应用程序提供了框架服务,现在Qt已经基本上支持所有的开发平台了,这里面既包含了桌面.嵌入式领域,也包括了Android.IOS.WP等移动操作平台,甚至 ...

  6. `cocos2dx非完整` 开始自己的FW模块

    上一篇的文章中说到了一些个人习惯的东西以及一些简单的项目配置,这一篇文章我们来进一步完善一些东西.首先,打开编译以后的客户端执行,会看到一大堆的fileutils加载luac文件的提示,在终端显示一大 ...

  7. 跨域名 Cookie 传递测试

    问题 我打开了 www.aaa.com 里面的一个页面(www.aaa.com/hello.php),其中这个 hello.php 里面包含一个 <img> 标签,里面的 src 来自于 ...

  8. Delphi 10.1 Berlin Starter Edition

    Delphi 10.1 Berlin Starter Edition Embarcadero® Delphi 10.1 Berlin Starter is a great way to get sta ...

  9. 转iOS中delegate、protocol的关系

    iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...

  10. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...