标签: objective-c-runtime

如何在C中纯粹编写iOS应用程序

我在这里读到在Objective-C之前学习C?

通常我会用纯C代码替换一些Obj-C代码(毕竟你可以根据需要混合它们,Obj-C方法的内容可以完全是纯C代码)

这是真的?

是否有可能纯粹使用C编程语言构建iPhone应用程序?

c cocoa-touch objective-c objective-c-runtime ios

352
推荐指数
3
解决办法
8万
查看次数

Objective-C类 - >字符串如:[NSArray className] - > @"NSArray"

我试图从类对象本身获取类的字符串名称.

// For instance
[NSArray className]; // @"NSArray"
Run Code Online (Sandbox Code Playgroud)

我发现object_getClassName(id obj)但是需要将一个实例传递给它,在我的情况下这是不必要的工作.

那么如何从类对象中获取字符串,而不是实例呢?

reflection metaprogramming objective-c objective-c-runtime

128
推荐指数
1
解决办法
6万
查看次数

为什么Objective-C不支持私有方法?

我已经看到了一些在Objective-C中声明半私有方法的策略,但似乎没有办法制作一个真正的私有方法.我接受.但是,为什么会这样呢?我基本上所说的每一个解释,"你不能这样做,但这里有一个近似的近似."

有许多适用于关键字的ivars(部件)控制它们的范围,例如@private,@public,@protected.为什么不能这样做呢?它似乎是运行时应该能够支持的东西.我缺少一种潜在的哲学吗?这是故意的吗?

objective-c objective-c-runtime

122
推荐指数
5
解决办法
2万
查看次数

Swift本机基类或NSObject

我测试了一些ISA混写有斯威夫特,以及时发现NSObject的是一个超类(直接或进一步上涨),或使用"@objc"的装饰,它才会起作用.否则它将遵循静态和vtable-dispatch样式,如C++.

没有Cocoa/NSObject基类定义Swift类是正常的吗?如果它是我关心的话,这意味着对Objective-C的大部分动力进行了描述,例如方法拦截和运行时内省.

动态运行时行为是属性观察者,核心数据,面向方面编程,高阶消息传递,分析和日志记录框架等功能的核心.

使用Objective-C的方法调用样式会在方法调用中添加大约20个机器代码操作数,因此在某些情况下(对具有小体的方法的许多严格调用)C++样式静态和vtable调度可以更好地执行.

但是考虑到一般的95-5规则(95%的性能增益来自调整5%的代码),从强大的动态功能开始并在必要时变硬是不是有意义的?

objective-c objective-c-runtime swift

101
推荐指数
3
解决办法
6万
查看次数

什么是objc_setAssociatedObject()以及在什么情况下应该使用它?

在我接受的一个项目中,原作者选择使用objc_setAssociatedObject(),我不是100%清楚它的作用或为什么决定使用它.

我决定查阅它,不幸的是,文档对其目的并不十分具有描述性.

objc_setAssociatedObject
使用给定的密钥和关联策略为给定对象设置关联值.
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
参数
object
关联的源对象.
key
关联的关键.
value
与对象的键键关联的值.通过nil清除现有关联.
policy
协会的政策.有关可能的值,请参阅"关联对象行为".

那么这个函数究竟做了什么以及在什么情况下应该使用它?


阅读答案后编辑

那么下面的代码有什么意义呢?

Device *device = [self.list objectAtIndex:[indexPath row]];
DeviceViewController *next = [[DeviceViewController alloc] initWithController:self.controller
                                                                            device:device
                                                                               item:self.rootVC.selectedItem];  
    objc_setAssociatedObject(device, &kDeviceControllerKey, next, OBJC_ASSOCIATION_RETAIN);
Run Code Online (Sandbox Code Playgroud)

如果设备已经是实例变量,那么将设​​备与视图控制器关联起来有什么意义呢?

iphone objective-c objective-c-runtime

67
推荐指数
4
解决办法
2万
查看次数

如何实现IMP函数返回在运行时确定的大型结构类型?

背景:CamelBones使用Objective-C运行时注册Perl类.为此,每个Perl方法都注册了相同的IMP函数; 该函数检查其self&_cmd参数以查找要调用的Perl方法.

对于已发送的消息,这已经好几年了objc_msgSend.但是现在我想添加对从Perl方法返回浮点和大型结构类型的支持.浮点并不难; 我只需编写另一个返回double的IMP,来处理调度的消息objc_msgSend_fpret.

问题是该怎么做objc_msgSend_stret.IMP为每个可能的结构返回类型编写一个单独的是不切实际的,原因有两个:首先,因为即使我这样做只是为了在编译时已知的结构类型,这是一个荒谬的函数数量.第二,因为我们讨论的是可以与任意Objective-C和Perl代码链接的框架,所以在编译框架时我们并不知道所有可能的结构类型.

我希望做的是编写一个IMP可以处理通过调度发送的任何返回类型的单个objc_msgSend_stret.我可以把它写成返回void,并将指针参数传递给返回缓冲区,就像旧的objc_msgSend_stret声明一样吗?即使这件事现在正常工作,我还能继续在将来继续工作吗?

感谢您的任何建议 - 我一直在讨论这个问题.:-)

更新:

以下是我从Apple的运行工程师那里收到的关于他们的objc语言邮件列表的建议:

您必须编写汇编代码来处理这种情况.

您的建议在某些体系结构上失败,其中"函数返回void以指向结构作为第一个参数的指针"的ABI与"返回结构的函数"不同.(在i386上,结构地址在一种情况下由调用者从堆栈中弹出,在另一种情况下由被调用者弹出.)这就是原型的 objc_msgSend_stret更改.

汇编代码将捕获struct返回地址,将其走私到非struct-return C函数调用中而不会干扰其余参数,然后在退出时执行正确的ABI特定清理(ret $4 在i386上).或者,汇编代码可以捕获所有参数.转发机械做这样的事情.如果你想看看这些技术是什么样的,那么该代码可能在开源CoreFoundation中.

我会把这个问题保持开放,以防有人集体讨论更好的想法,但直接来自Apple自己的"运行时争吵者",我认为这可能是我可能得到的权威答案.是时候把x86参考手册上的灰尘弄掉,然后把我的装配工的铁锈搞得一团糟,我猜...

perl objective-c objective-c-runtime

59
推荐指数
1
解决办法
1835
查看次数

在Objective-C中究竟是什么超级?

据我所知,它是指向超类的指针.它与超类硬连接,而不是在运行时动态计算出来的.想更详细地了解它......

任何人?

objective-c super objective-c-runtime

48
推荐指数
4
解决办法
3万
查看次数

41
推荐指数
2
解决办法
2万
查看次数

获取Objective-C类或实例的所有方法

在Objective-C中,我可以测试给定的类或实例是否响应某些选择器.但是如何查询类或实例的所有方法或类的属性(例如所有方法或属性的列表)?

introspection objective-c objective-c-runtime

38
推荐指数
3
解决办法
2万
查看次数

类是在两者中实现的.将使用两者之一

我有一个项目,它具有依赖(通过CocoaPods安装)使用SocketRocket并从HeapAnalytics导入一个静态库.显然,HeapAnalytics库已经使用了SocketRocket.编译时没有错误,但在运行时收到以下内容:

Class SRWebSocket is implemented in both [path] and [path].
One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理它,因为我看到的大多数解决方案都需要自己编译静态库来更改类名等,而且我无法访问源代码.

有什么建议?

objective-c objective-c-runtime ios socketrocket

36
推荐指数
2
解决办法
4万
查看次数