显示标签为“object-c”的博文。显示所有博文
显示标签为“object-c”的博文。显示所有博文

2013年6月27日星期四

[转] Objective C 类方法

Objective C 类方法

一,Objective C  的类方法(class method),即 static 方法,是用 + 修饰的方法。类方法是属于类对象的,所以无需创建类的实例对象我们就可以直接使用它们。使用形式为:
[ClassName classMethod];
在这里 ClassName 代表的就是一个类对象,而不是作为一种类型。类名只有出现在接收消息的表达式中才代表一个类对象,其他情况下都表示一种类型。
二,类方法可以继承自基类,就像普通的类成员方法一样。有一个特别的类方法 + (void) initialize,在类接收到任何消息之前,运行时系统会向类对象发送这个消息,因此我们可以在这个函数里对类对象做一些初始化,比如初始化 static 变量等等。在 NSObject 中,该方法什么也不做。
三,当类对象接收到一个消息却没有相应的类方法响应时,运行时系统会去检查是否存在一个 root (通常是 NSObject)的实例方法能够响应,如果能够响应就会执行 root 的成员方法来响应。只有在这种情况下,类对象才能够执行实例方法!再次声明类对象执行实例方法的条件:
1,类对象没有相应的类方法来响应某个发送至它的消息;
2,root 类定义了能够响应这个消息的实例方法。
四,类方法的返回值类型默认为 id,也能接受不定参数,这些都与实例方法是一致的。例如:
+ makeGroup:group, ...;
五,在类方法中使用 self 和 super,这时 self 和 super 指代的都是类对象,而非实例对象,这一点要特别注意。推荐的工厂方法写法如下,在这里使用 self class 而不是直接写类名,是为了应对子类调用该函数的情况。
+ (id) getInstance
{
    id instance = [[[self class] alloc] init];
    return [instance autorelease];
}

2013年6月7日星期五

[转] objective-c 中 nonatomic的作用

objective-c中nonatomic的作用

它要与@synthesize一起使用才有意义。
atomic的意思就是setter/getter这个函数是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样。
nonatomic不保证setter/getter的原语行,所以你可能会取到不完整的东西。

比如setter函数里面改变两个成员变量,如果你用nonatomic的话,getter可能会取到只更改了其中一个变量时候的状态,这样取到的东西会有问题。

如果不需要多线程支持的话,当然nonatomic就够用了,另外由于不涉及锁操作,所以它执行相对快点

2013年5月3日星期五

[转] 那些被遗漏的 Objective-C 保留字

原始链接: http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/


今天翻到很久以前自己在网易博客上写的这篇文章,惊奇地发现自己都忘记了里面的一些内容。所以我又重新学习了一下,然后改了改内容,挪到这里。

前言

Steffen Itterheim《Learn Iphone and Ipad Cocos2d Game Development》作者。cocos2d和cocos2d-x现在已成为著名的游戏开发引擎。在AppStore上有超过100个游戏是基于Cocos2D。
Steffen Itterheim在他的博客中总结了 Objective-C 2.0 所有的编译器保留字,并且对这些保留字做了介绍和使用示例。这些保留字如下:
@class
@defs
@protocol @required @optional @end
@interface @public @package @protected @private @property @end
@implementation @synthesize @dynamic @end
@throw @try @catch @finally
@synchronized @autoreleasepool
@selector @encode
@compatibility_alias
@”string”
我把这些保留字过了一遍,发现很少用到的有 @dynamic @defs @encode @compatibility_alis,所以就给大家介绍一下这几个关键字吧。

@dynamic

@dynamic 是相对于 @synthesize的,它们用样用于修饰 @property,用于生成对应的的getter和setter方法。但是@ dynamic表示这个成员变量的getter和setter方法并不是直接由编译器生成,而是手工生成或者运行时生成。
示例如下:
1
2
3
4
5
6
7
@implementation ClassName
@synthesize aProperty, bProperty;
@synthesize cProperty=instanceVariableName;
@dynamic anotherProperty;

// method implementations
@end

@defs

@defs 用于返回一个Objective-C类的struct结构,这个struct与原Objective-C类具有相同的内存布局。就象你所知的那样,Objective-C类可以理解成由基本的C struct加上额外的方法构成。
示例代码如下:
1
struct { @defs( NSObject) }
你可能会想,什么情况下才会需要使用这个关键字。答案是涉及非常底层的操作或优化的时候才会用到。像如这篇讨论Objective-C如何做缓存优化的文章中,就用到了该关键字。

@encode

@encode 是用于表示一个类型的字符串,对此,苹果有专门的介绍文档
示例如下:
1
2
3
4
5
6
7
8
9
10
-(void) aMethod
{
    char *enc1 = @encode(int);                 // enc1 = "i"
    char *enc2 = @encode(id);                  // enc2 = "@"
    char *enc3 = @encode(@selector(aMethod));  // enc3 = ":"

    // practical example:
    CGRect rect = CGRectMake(0, 0, 100, 100);
    NSValue *v = [NSValue value:&rect withObjCType:@encode(CGRect)];
}

@compatibility_alis

@compatibility_alis 是用于给一个类设置一个别名。这样就不用重构以前的类文件就可以用新的名字来替代原有名字。
示例如下:
1
@compatibility_alias AliasClassName ExistingClassName

@autoreleasepool

@autoreleasepool 是用于ARC下代替 NSAutoreleasePool的保留字,我把它写在这里,是想告诉那些以为ARC慢的同学,在苹果的这篇官方文档中有提到, @autoreleasepool 比 NSAutoreleasePool快6倍。当然,文档中也提到,ARC下不止Autorelease Pool的实现变快了,retain和release也快很多。如果你还没有在工程中使用ARC,推荐看看我的《是否应该使用ARC》

Cheat Sheet

有一个热心者根据他的博文,制作了一张《Objective-C 2.0保留字速查表》,对于新手来说,把这张速查表打印出来,对于熟悉现在的保留字还是很有用的,它的下载地址是:http://maniacdev.com/cheatsheetobjccd.pdf