Objective-C/C++
-
Objective-C Runtime https://www.iteye.com/blog/lobin-2524472
Objective-C由Brad Cox和Tom Love于1980年发明。
http://www.gnustep.org/resources/documentation/ObjectivCBook.pdf
Objective-C 1.0
Objective-C 1.0也称“traditional” Objective-C
Objective-C 2.0
从C到Objective-C
块
定义一个块变量
void (^LOG0) (NSString *);
void (^LOG) (NSString *, ...);
定义一个块变量并赋值
void (^LOG0) (NSString *) = ^(NSString *format) {
//NSLog(format);
NSLog(format, nil);
NSLog(@"%@", format);
//*
NSString *str = [NSString stringWithFormat:@"%@", format];
NSLog(@"%@",str);
//*/
};
void (^LOG) (NSString *, ...) = ^(NSString *format, ...) {
va_list va;
va_start(va, format);
NSLogv(format, va);
va_end(va);
};
等号后面是一个表示块的字面量(block literal)。
定义一个块类型
typedef void (^log0) (NSString *);
typedef void (^logx) (NSString *, ...);
log0 fn_log0 = LOG0;
logx fn_logx = LOG;
调用
LOG0(@"Hello, world.");
LOG(@"%@: Hello, world.", @"Cocoa");
fn_log0(@"Hello, world.");
fn_logx(@"%@: Hello, world.", @"Cocoa");
对象
调用
通常其他语言在调用一个对象方法时,通常是这样的:
obj.firstMethod();
obj.secondMethod(2);
而在Objective-C/C++语言中则是这样:
[obj firstMethod];
[obj secondMethod: 2];
调用机制
Objective-C/C++和其他面向对象语言不一样的是,调用对象方法在Objective-C/C++语言中是向对象发送一个消息,并接收返回一个消息。不管哪种方式,都本质上都是对象间通信。
这实际上是通过objc_msgSend发送一个消息给对象obj。objc_msgSend是Objective-C/C++运行时库提供的函数。我们也可以通过objc_msgSend向对象发送和接收消息。
发送和接收消息
OBJC_EXPORT void objc_msgSend(void /* id self, SEL op, ... */ )
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0);
OBJC_EXPORT id objc_msgSend(id self, SEL op, ...)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0);
typedef struct objc_selector *SEL;
objc_msgSendSuper
OBJC_EXPORT void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ )
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0);
OBJC_EXPORT id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0);
除了以上方式,还可以通过performSelector、类似反射方式以及NSInvocation来向对象发送和接收消息。performSelector方式使用起来不是很方便,只能接受不超过2个的参数个数。
通过performSelector来向对象发送和接收消息
- (void) firstMethod;
- (void) secondMethod: (int) arg;
SimpleClass *obj = [SimpleClass new];
[obj performSelector:@selector(firstMethod)]; // just only without argument.
[obj performSelector:@selector(secondMethod:) withObject: (id) 2]; // just only with one argument.
通过类似反射方式来向对象发送和接收消息
- (void) firstMethod;
SimpleClass *obj = [SimpleClass new];
void (*firstMethod)(id, SEL); // - (void) firstMethod;
firstMethod = (void (*) (id, SEL)) [obj methodForSelector: @selector(firstMethod)];
firstMethod(obj, @selector(firstMethod));
通过NSInvocation来向对象发送和接收消息
- (void) secondMethod: (int) arg;
SimpleClass *obj = [SimpleClass new];
NSMethodSignature *secondMethodSignature = [obj methodSignatureForSelector: @selector(secondMethod:)];
NSInvocation *secondMethodInvocation = [NSInvocation invocationWithMethodSignature: secondMethodSignature];
[secondMethodInvocation setTarget:obj];
[secondMethodInvocation setSelector:@selector(secondMethod:)];
int arg = 2000;
[secondMethodInvocation setArgument:&arg atIndex:2];
[secondMethodInvocation invoke];
类
■ An interface that declares the methods and instance variables of the class and names its superclass
■ An implementation that actually defines the class (contains the code that implements its methods)
NSObject
所有类的基类。NSObject不是所有其他类的隐式基类,需要显式的从NSObject继承。NSObject在Foundation中定义。
new方法覆盖(Override)
+ (id)new { id handle = [super new]; printf("new of BaseClass.\n"); return handle; }
alloc方法覆盖(Override)
+ (id)alloc { id handle = [super alloc]; printf("alloc of BaseClass.\n"); return handle; }
init方法覆盖(Override)
- (id)init { self = [super init]; printf("init of BaseClass.\n"); return self; }
Objective-C混合编程
Runtime
Objective-C/C++编程中可以直接调用Runtime运行时库提供的底层功能。比如直接调用objc_msgSend向对象发送消息。
objc_msgSend
- (void) firstMethod;
- (void) secondMethod: (int) arg;
SimpleClass *obj = [SimpleClass new];
SEL firstMethodSel = @selector(firstMethod);
objc_msgSend((id)obj, firstMethodSel); // [obj firstMethod];
SEL secondMethodSel = @selector(secondMethod:);
objc_msgSend((id)obj, secondMethodSel, 2); // [obj secondMethod: 2];
- (int) firstMethodWithRet;
- (int) secondMethodWithRet: (int) arg;
SEL firstMethodWithRetSel = @selector(firstMethodWithRet);
int ret = (int) objc_msgSend((id)obj, firstMethodWithRetSel); // int ret = [obj firstMethodWithRet];
printf("firstMethodWithRet. ret=%d\n", ret);
SEL secondMethodWithRetSel = @selector(secondMethodWithRet:);
ret = (int) objc_msgSend((id)obj, secondMethodWithRetSel, 2); // int ret = [obj secondMethodWithRet: 2];
printf("secondMethodWithRet. ret=%d\n", ret);
调用C静态链接库
#include <stddef.h> #if ! defined(QT) #define QT struct qt { size_t size; char data[]; }; struct qt* qt(int i); int qt_get(struct qt* v); int qt_destroy(struct qt* v); #endif
#include<stdlib.h> #include<string.h> #include"qt.h" struct qt* qt(int i) { size_t size = sizeof(i); struct qt* v = (struct qt*) malloc(sizeof(struct qt) + size); if (v != NULL) { v->size = size; memcpy(v->data, &i, sizeof(i)); } return v; } int qt_get(struct qt* v) { int *p = NULL; if (v == NULL) { return 0; } p = (int *) v->data; return *p; } int qt_destroy(struct qt* v) { free(v); return 0; }
编译
# gcc -c qt.c -o qt.o
生成静态库
# ar rc libqt.a qt.o
#include <stdio.h> #include "qt.h" #import <Foundation/Foundation.h> int main(int argc, char *argv[]) { int i = 1413; struct qt* v = qt(i); if (v == NULL) { return 1; } printf("qt: i=%d\n", qt_get(v)); NSLog(@"qt: i=%d", qt_get(v)); qt_destroy(v); return 0; }
gcc -framework Foundation -L . libqt_test.m -o libqt_test -lqt
编写静态链接库
#include <stddef.h> #if ! defined(QT) #define QT struct qt { size_t size; char data[]; }; struct qt* qt(int i); int qt_get(struct qt* v); int qt_destroy(struct qt* v); #endif
其实就是把上面的.c文件改为.m文件即可。
#include<stdlib.h> #include<string.h> #include"qt.h" struct qt* qt(int i) { size_t size = sizeof(i); struct qt* v = (struct qt*) malloc(sizeof(struct qt) + size); if (v != NULL) { v->size = size; memcpy(v->data, &i, sizeof(i)); } return v; } int qt_get(struct qt* v) { int *p = NULL; if (v == NULL) { return 0; } p = (int *) v->data; return *p; } int qt_destroy(struct qt* v) { free(v); return 0; }
编译
# gcc -c qt.m -o qt.o
生成静态库
# ar rc libqt.a qt.o
#include <stdio.h> #include "qt.h" #import <Foundation/Foundation.h> int main(int argc, char *argv[]) { int i = 1413; struct qt* v = qt(i); if (v == NULL) { return 1; } printf("qt: i=%d\n", qt_get(v)); NSLog(@"qt: i=%d", qt_get(v)); qt_destroy(v); return 0; }
gcc -framework Foundation -L . libqt_test.m -o libqt_test -lqt
编译
$ gcc -framework Foundation hello.m -o hello -v
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.12.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name hello.m -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-cpu penryn -target-linker-version 305 -v -dwarf-column-info -debugger-tuning=lldb -resource-dir /Library/Developer/CommandLineTools/usr/lib/clang/9.0.0 -fdebug-compilation-dir /root/objective-c -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -fblocks -fobjc-runtime=macosx-10.12.0 -fencode-extended-block-signature -fobjc-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/2l/yzjcl8j56693p3y40qcnr4zc0000gn/T/hello-313d89.o -x objective-c hello.m
clang -cc1 version 9.0.0 (clang-900.0.39.2) default target x86_64-apple-darwin16.7.0
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Library/Developer/CommandLineTools/usr/lib/clang/9.0.0/include
/Library/Developer/CommandLineTools/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
"/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o hello -framework Foundation /var/folders/2l/yzjcl8j56693p3y40qcnr4zc0000gn/T/hello-313d89.o -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/9.0.0/lib/darwin/libclang_rt.osx.a
相关推荐
Objective-C是基于C语言的,主要用于构建iOS和macOS应用程序,而Objective-C++则是Objective-C的一个扩展,它引入了C++的特性,使得开发者可以同时利用Objective-C的动态特性和C++的面向对象编程能力。 ### ...
基于Objective-C/Objective-C++实现的微信自动抢红包动态库+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 微信自动抢红包动态库 ###功能介绍 此动态库...
Objective-C是C语言的超集,这意味着任何有效的C代码都可以在Objective-C中使用。由于C++也是C的超集,因此Objective-C也能够直接支持C++代码。开发者可以在Objective-C类中嵌入C++代码,反之亦然。 2. **命名空间...
18. Objective-C与C/C++的混合编程:Objective-C与C语言兼容,因此可以轻松地在Objective-C程序中使用C代码。同时,它也能够与C++代码进行交互,但需要遵守特定的规则和约定。 19. Import指令:在Objective-C中,@...
所以有一定C/C++语言基础理解和掌握Objective-C也会相应的快些。这回,我们将比较着学习 Objective-C语言,掌握其语法并理解其思想。 语法 让我们先来看看C++和Objective-C中对于类的宣言 : C++ #...
**Objective-C**是一种结合了C语言的基础特性和Smalltalk式消息传递机制的面向对象编程语言。作为C语言的一个超集,Objective-C允许开发者直接使用C语言代码。此外,它还借鉴了C++的一些特性,尽管它并非C++的直接...
Objective-C的基本语法类似于C++,但在面向对象方面有着自己独特的特点。下面将详细介绍Objective-C的基本语法元素: 1. **类定义** - 类定义通常分为头文件(.h)和实现文件(.m)两部分。头文件负责声明接口...
此外,可能会对比两种语言的类系统,解释如何在Objective-C中使用C++代码,以及如何在C++项目中集成Objective-C。 通过阅读这三本书,读者将全面了解Objective-C的各个方面,从基础语法到高级特性和最佳实践。无论...
### 从C++到Objective-C:关键知识点概览 #### 一、Objective-C与Cocoa概述 **Objective-C**是一种面向对象的编程语言,它是C语言的一种扩展,旨在支持面向对象编程特性。Objective-C最著名的应用是在苹果公司的...
由于Objective-C是从C语言扩展而来的,因此它可以无缝地与其他C/C++代码进行互操作。这一点对于那些希望在现有项目中逐步引入Objective-C功能的开发者来说非常重要。 - **直接嵌入C代码**: 可以直接在Objective-C...
《从 C++ 到 Objective-C 快速精通》是一本专为C++程序员设计的指南,旨在帮助他们迅速掌握Objective-C这门强大的编程语言。Objective-C是苹果平台上的主要开发语言,尤其在iOS和macOS应用程序开发中占据核心地位。...
从C++到Objective-C的转型指南涉及到了几个重要的IT知识领域,主要包括编程语言的比较、面向对象编程的概念、Objective-C语言的语法特点以及与C++的共性和差异。 首先,Objective-C是一种主要在苹果公司产品开发中...
在Objective-C中,方法调用是通过向对象发送消息来完成的,而不是像C++那样直接调用成员函数。这种消息传递机制使得Objective-C的代码风格非常独特。 Objective-C的消息传递使用中括号表示法,例如,对象obj调用一...
将 Objective-C 和 C++ 结合起来进行混合编程可以带来许多优势,特别是在需要高性能和灵活性的项目中。这种混合编程通常发生在 iOS 或 macOS 开发中,因为 Objective-C 是苹果平台的主要编程语言之一,而 C++ 则提供...
标题为“From C++ to Objective-C (从C++到Objective-C)”的文章主要探讨了从C++转向Objective-C的程序员应该了解的关键概念和差异。Objective-C是一种主要用在苹果公司产品开发上的面向对象的编程语言,特别是在Mac...
1. **GCC**:GCC是GNU项目的一部分,提供了一套C、C++、Objective-C、Fortran、Ada和Go等编程语言的编译器。在CentOS 7上,GCC用于编译源代码,是许多开源软件的基础。 2. **PCRE-devel**:PCRE库用于实现Perl风格...
Objective-C是一种面向对象的编程语言,主要用于Apple的macOS和iOS操作系统,它在C语言的基础上增加了Smalltalk风格的消息传递机制。 在CodeBlocks中集成Objective-C,首先需要确保你已经安装了GCC的Objective-C...