问题标签 [objective-c-runtime]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
10800 浏览

objective-c - “无法识别的选择器发送到实例”错误是什么意思?

由于以下错误,我的应用程序崩溃:

谁能告诉我这是什么意思以及如何在我的代码中找到引用 0x612b060 的行

0 投票
2 回答
443 浏览

objective-c - 块中的 retainCount 显示异常行为

我在一堂课上得到了这段代码:

这个 NSLog() 的输出是:

copy方法的文档是这样说的:

特别注意事项

如果您使用托管内存(不是垃圾回收),此方法会在返回新对象之前保留它。然而,方法的调用者负责释放返回的对象。

所以。NSLog() 的输出总是显示相同的值retainCount

0 投票
2 回答
1834 浏览

objective-c - 目标 C 初始化

免责声明,我是Objective C的新手。但我找不到这个解释。我已经看到了两种实现 init 的方法:

所以假设我有:

其中 MyObject 类是 NSObject 的子类。在第二个例子中,init 不返回 NSObject 的初始化版本吗?所以 myObj 会......它怎么知道它是什么?它不会认为它是 NSObject 而不是 MyObject 吗?

0 投票
1 回答
1054 浏览

iphone - Objective-C:从多个线程调用和复制同一个块

我在这里处理神经网络,但忽略它是安全的,因为真正的问题必须处理objective-c中的块。这是我的问题。我找到了一种将神经网络转换为可以一次执行的大块的方法。但是,相对于激活网络而言,它的运行速度非常非常慢。这似乎有点违反直觉。

如果我给你一组嵌套函数,比如

从理论上讲,多次运行该函数应该比遍历一堆连接以及设置节点活动/非活动等更容易/更快,所有这些最终都会计算出相同的函数。

但是,当我创建一个块(请参阅线程:如何在运行时创建函数)并运行此代码时,对于任何中等规模的网络来说,它都非常慢。

现在,我不太明白的是:

  1. 当你复制一个块时,你到底在复制什么?
  2. 比方说,我复制一个块两次,copy1 和 copy2。如果我在同一个线程上调用 copy1 和 copy2 ,是否调用了同一个函数?我不明白文档对块副本的确切含义:Apple Block Docs
  3. 现在,如果我再次制作该副本,copy1 和 copy2,但相反,我在单独的线程上调用副本,那么这些函数的行为如何?当每个线程都试图访问同一个块时,这是否会导致某种减速?
0 投票
1 回答
1934 浏览

objective-c - 如何实现返回运行时确定的大型结构类型的 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更改原型的原因。

汇编代码将捕获结构返回地址,将其偷运到非结构返回 C 函数调用中,而不会干扰其余参数,然后在退出时(ret $4 在 i386 上)进行正确的 ABI 特定清理。或者,汇编代码可以捕获所有参数。转发机器会做这样的事情。如果您想了解这些技术是什么样子,那么该代码可能位于开源 CoreFoundation 中。

我会留下这个问题,以防有人集思广益,但这个问题直接来自苹果自己的“运行时牧马人”,我认为这可能是我可能得到的最权威的答案。是时候清理 x86 参考手册的灰尘并敲掉我的汇编器上的锈迹了,我猜...

0 投票
1 回答
1657 浏览

objective-c - 目标 C:在非结构或联合的情况下请求成员 XXX

尝试运行以下代码(片段)时,我遇到了错误(在主题中说明)。错误指向我下面代码的第 3 行和第 4 行。

在这组代码之前,我已经为 ShapeColor 和 ShapeBoundary 定义了枚举和结构,如下所示

另外,我已经定义了“Circle”类的接口和实现

我使用@property 和@synthesize 为“fillColor”和“Shapebounds”定义了我的getter 和setter 方法。我使用属性和综合的方式是否有问题导致主题出现错误?或者我有什么问题错过了。非常感谢您对此提出任何建议。

谢谢并恭祝安康

振和

0 投票
1 回答
490 浏览

objective-c - ObjC类运行时进程+初始化问题?

我只是想了解客观的 C 对象运行时过程

从 Object Refs 中,对象的 +Initialize 方法将在它第一次调用某个方法时被调用。我运行如下测试文件。我想知道为什么这些对象只调用了 +load 。

0 投票
1 回答
4186 浏览

objective-c - 在 dealloc 中使用 self.property = nil 有什么问题吗?

我知道声明的属性会生成访问器方法,这在某种程度上只是语法糖。

我发现很多人self.property = nil在他们的dealloc方法中使用。

1)在苹果的内存管理文档中,p23 说:

唯一不应该使用访问器方法来设置实例变量的地方是 init 方法和 dealloc。

为什么不应该?

2) 在苹果的Objective-C 2.0中,p74

声明的属性从根本上代替了访问器方法的声明;当你合成一个属性时,编译器只创建任何不存在的访问器方法。与该 dealloc 方法没有直接交互——属性不会自动为您释放。然而,声明的属性确实提供了一种交叉检查方法实现的有用 dealloc 方法:您可以在头文件中查找所有属性声明,并确保释放未标记 assign 的对象属性,并且 assign 未释放标记的对象属性。

注意:通常在dealloc方法中,您应该release直接对象实例变量(而不是调用 set 访问器并nil作为参数传递),如下例所示:

但是,如果您正在使用现代运行时并合成实例变量,则无法直接访问实例变量,因此您必须调用访问器方法:

注释是什么意思?

我发现[property release];并且[self setProperty:nil];两者都有效。

0 投票
3 回答
3444 浏览

cocoa - 为什么 Objective-C 对象必须动态分配?

为什么 Objective-c 对象必须动态分配?为什么我必须使它成为一个指向对象的指针,不像在 C++ 中我可以在堆栈上创建它们?谢谢。

0 投票
1 回答
2360 浏览

cocoa - 如何在运行时在 NSButton 上独立缩放轴

在 Interface Builder 中,您可以选择按钮图像的缩放方式,为“缩放”下拉菜单选择 Axes Independent、Proportionally Down 等。如何在运行时访问或更改 NSButton 的此属性?