设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

从 C++ 到 Objective-C 的快速指南

2014-5-15 09:41| 发布者: 红黑魂| 查看: 4181| 评论: 0|来自: 开源中国编译

摘要: 简介当我开始为iOS写代码的时候,我意识到,作为一个C++开发者,我必须花费更多的时间来弄清楚Objective-C中怪异的东西。这就是一个帮助C++专家的快速指南,能够使他们快速的掌握Apple的iOS语言。请注意这绝不是一个 ...

类定义,方法,数据,继承

01// Objective C
02@class f2; // forward declaration
03@interface f1 : NSOBject // Objective-C supports only public and single inheritance
04{
05 int test; // default = protected
06@public
07 int a;
08 int b;
09 f2* f;
10}
11- (void) foo;
12@end
13 
14@implementation f1
15- (void) foo
16{
17 a = 5// ok
18 self->a = 5// ok
19super.foo(); // parent call
20}
21@end
22 
23// C++
24class f1 : public CPPObject
25{
26 int test; // default = private
27public:
28 class f2* f; // forward declaration
29 int a;
30 int b;
31 void foo();
32}
33 
34void f1 :: foo()
35{
36 a = 5// ok
37 this->a = 5// ok
38 CPPOBject::foo(); // parent call
39}

Objective-C中的实现范围在@implementation/@end 标记 (在 C++ 中我们可以将实现放在任何带有::范围操作符的地方)之中. 它使用@class关键字用于事先声明. Objective-C 默认带有 私有(private) 保护, 但仅用于数据成员(方法必须是公共的). Objective-C 使用 self 而不是 this ,并且它还可以通过super关键字调用它的父类.


构造器和析构器

01// Objective-C
02NSObject* s = [NSObject alloc] init]; // can return nil if construction failed
03[s retain]; // Increment the ref count
04 
05// C++
06CPPObject* ptr = new CPPObject();   // can throw
07ptr->AddRef();
08 
09// Objective-C
10NSObject* s = [NSObject alloc] initwitharg:4];
11[s release];
12 
13// C++
14CPPOBject* ptr = new CPPOBject(4);
15ptr->Release();

Objective-C中的内存分配是通过静态成员方法alloc来实现的,所有 (做为NSObject后裔)的对象都有这个方法. self 在Objective-C中是可以被赋值的,而如果构建失败的话它就会设置成nil(而在C++中则会被抛出一个异常). 内存分配之后实际被构造器调用的是一个公共的成员函数,在Objective-C中默认的是init方法. 

Objective-C 使用同COM益阳的引用计数方法, 而它也使用 retain 和 release (等同于IUnknown的 AddRef() 和 Release() 方法). 当引用计数到了0,则对象会从内存中被移除掉.


多线程

01// Objective C
02@interface f1 : NSOBject // Objective-C supports only public and single inheritance
03{
04}
05- (void) foo;
06- (void) threadfunc :(NSInteger*) param;
07- (void) mt;
08 
09@end
10 
11@implementation f1
12 
13- (void) threadfunc : (NSInteger*) param
14{
15[self performSelectorOnMainThread: @selector(mt)];
16}
17 
18- (void) mt
19{
20}
21 
22- (void) foo
23{
24[self performSelectorInBackground: @selector(thradfunc:) withObject:1 waitUntilDone:false];
25<div></div>} 
26@end

Objective-C 有一些针对NSObject的内建功能,可以在另外一个线程中操作一个选择器 (== 调用一个成员), 在主线程中,等待一次调用等等 . 在NSObject 参见更多信息. 

内存和ARC

1// Objective-C
2@interface f1 : NSObject
3{
4}
5@property (weak) NSAnotherObject* f2; // 当没有其它强引用存在的时候,它将会被自动设置成.

1@end
2 
3- (void) foo
4{
5NSObject* s = [NSObject alloc] init]; // 如果构造失败的话会返回nil
6// use s
7// end. Hooraah! Compiler will automatically call [s release] for us!
8}

这里需要你忘记自己良好的 C++ 习惯. OK Objective-C 使用了一个垃圾收集机制,这种东西我们C++很讨厌,因为它很慢并会让我们想到Java. 但是 ARC (自动进行引用计算) 是一种 编译时间 特性,它会告诉编译器 "这里是我的对象:请帮我算算啥时候它们才要被销毁吧". 使用ARC你就不需要发送 retain/release 消息给你的对象了; 编译器会自动帮你代劳的.


为了能帮助编译器决定保留一个对象多长时间,你还要一个弱引用指向一个变量. 默认的,所有的变量都是强引用(==只要强引用还存在,被引用的对象就会存在下去) . 你也可以获取一个弱引用,它会随着每个强引用消失而失去它的值. 这在类成员从XCode的Builder Interface(像RC 编辑器)处获取它们的值时,会很有用,当类被销毁时,那些成员也会失去它们的值.

Strings

1// Objective-C
2NSString* s1 = @"hello";
3NSString* s2 = [NSString stringWithUTF8String:"A C String"];
4sprintf(buff,"%s hello to %@","there",s2);
5const char* s3 = [s2 UTF8String];

NSString 是一个Objective-C字符串的不可变表示. 你可以使用其一个静态方法,或者是一个带有@前缀的字符串文本来创建NSString. 你也可以使用 %@  来向printf家族函数来表示一个NSString,




酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部