问题标签 [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.
objective-c - “无法识别的选择器发送到实例”错误是什么意思?
由于以下错误,我的应用程序崩溃:
谁能告诉我这是什么意思以及如何在我的代码中找到引用 0x612b060 的行
objective-c - 块中的 retainCount 显示异常行为
我在一堂课上得到了这段代码:
这个 NSLog() 的输出是:
该copy
方法的文档是这样说的:
特别注意事项
如果您使用托管内存(不是垃圾回收),此方法会在返回新对象之前保留它。然而,方法的调用者负责释放返回的对象。
所以。NSLog() 的输出总是显示相同的值retainCount
?
objective-c - 目标 C 初始化
免责声明,我是Objective C的新手。但我找不到这个解释。我已经看到了两种实现 init 的方法:
和
所以假设我有:
其中 MyObject 类是 NSObject 的子类。在第二个例子中,init 不返回 NSObject 的初始化版本吗?所以 myObj 会......它怎么知道它是什么?它不会认为它是 NSObject 而不是 MyObject 吗?
iphone - Objective-C:从多个线程调用和复制同一个块
我在这里处理神经网络,但忽略它是安全的,因为真正的问题必须处理objective-c中的块。这是我的问题。我找到了一种将神经网络转换为可以一次执行的大块的方法。但是,相对于激活网络而言,它的运行速度非常非常慢。这似乎有点违反直觉。
如果我给你一组嵌套函数,比如
从理论上讲,多次运行该函数应该比遍历一堆连接以及设置节点活动/非活动等更容易/更快,所有这些最终都会计算出相同的函数。
但是,当我创建一个块(请参阅线程:如何在运行时创建函数)并运行此代码时,对于任何中等规模的网络来说,它都非常慢。
现在,我不太明白的是:
- 当你复制一个块时,你到底在复制什么?
- 比方说,我复制一个块两次,copy1 和 copy2。如果我在同一个线程上调用 copy1 和 copy2 ,是否调用了同一个函数?我不明白文档对块副本的确切含义:Apple Block Docs
- 现在,如果我再次制作该副本,copy1 和 copy2,但相反,我在单独的线程上调用副本,那么这些函数的行为如何?当每个线程都试图访问同一个块时,这是否会导致某种减速?
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 参考手册的灰尘并敲掉我的汇编器上的锈迹了,我猜...
objective-c - 目标 C:在非结构或联合的情况下请求成员 XXX
尝试运行以下代码(片段)时,我遇到了错误(在主题中说明)。错误指向我下面代码的第 3 行和第 4 行。
在这组代码之前,我已经为 ShapeColor 和 ShapeBoundary 定义了枚举和结构,如下所示
另外,我已经定义了“Circle”类的接口和实现
我使用@property 和@synthesize 为“fillColor”和“Shapebounds”定义了我的getter 和setter 方法。我使用属性和综合的方式是否有问题导致主题出现错误?或者我有什么问题错过了。非常感谢您对此提出任何建议。
谢谢并恭祝安康
振和
objective-c - ObjC类运行时进程+初始化问题?
我只是想了解客观的 C 对象运行时过程
从 Object Refs 中,对象的 +Initialize 方法将在它第一次调用某个方法时被调用。我运行如下测试文件。我想知道为什么这些对象只调用了 +load 。
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];
两者都有效。
cocoa - 为什么 Objective-C 对象必须动态分配?
为什么 Objective-c 对象必须动态分配?为什么我必须使它成为一个指向对象的指针,不像在 C++ 中我可以在堆栈上创建它们?谢谢。
cocoa - 如何在运行时在 NSButton 上独立缩放轴
在 Interface Builder 中,您可以选择按钮图像的缩放方式,为“缩放”下拉菜单选择 Axes Independent、Proportionally Down 等。如何在运行时访问或更改 NSButton 的此属性?