标签: objective-c-runtime

Swallow 无法识别来自 NSInvocation forwardInvocation 调用的选择器异常

我有一个正在转发接收消息的对象。它没有实现使用forwardInvocation. 但是,methodSignatureForSelector由于程序的组织方式,在某些时候不会总是返回有效的方法签名。如何吞下由缺少的方法签名生成的异常?覆盖doesNotRecognizeSelector不起作用。谢谢。

objective-c objective-c-runtime message-forwarding nsinvocation

2
推荐指数
1
解决办法
548
查看次数

在Objective C中,如何获取元类对象?

Objective-C,如何获取元类对象?二者[self class][ClassName class]只返回类对象。

metaclass objective-c objective-c-runtime

2
推荐指数
1
解决办法
622
查看次数

如果 appl 编译为本机,为什么还需要 Objective C 运行时

Swift/Objective-c 新手,具有 Java、C# 和 C++ 背景。我的理解是,如果代码是非本机的,就像 Java 或 C# 一样,会生成中间代码,在运行时需要一个将代码转换为机器语言的环境,我们称之为运行时环境(例如JRE)。

因此,在阅读了有关堆栈溢出的一些 Q 和 As 后,很明显 Swift 和 Objective-C 都被编译为本机二进制文件。但它们需要 Objective-C 运行时来执行它们。

我不知道如果代码已经是机器语言,为什么还需要运行时?

它就像一个链接到程序的库吗?

或者这个 Objective-C 运行时是托管 Objective-C/Swift 程序的单独环境吗?就像 JRE 一样?

有人可以解释一下吗?

谢谢,艾哈迈德

objective-c objective-c-runtime

2
推荐指数
1
解决办法
237
查看次数

KVO Swift:newValue 始终为零

有以下例子:

import UIKit

@objc class ViewController: UIViewController {

    @objc dynamic var buggyApple: NSObject?

    var obs: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()
        obs = observe(\.buggyApple, changeHandler: { (obj, change) in
            print(change)
        })
        buggyApple = NSObject()
        buggyApple = NSObject()
    }
}
Run Code Online (Sandbox Code Playgroud)

我在调试控制台中得到相应的输出:

NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)
NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)
Run Code Online (Sandbox Code Playgroud)

ViewController在 中的回调内检查断点上的对象时LLDB,我得到以下信息:

(lldb) po obj.buggyApple
? Optional<NSObject>
  - some : <NSObject: 0x600000908fa0>
Run Code Online (Sandbox Code Playgroud)

所以,实际上 newNSObject已经成功发送了,但是,change …

objective-c-runtime key-value-observing swift

2
推荐指数
1
解决办法
964
查看次数

class_getClassMethod经常返回nil(似乎只适用于类级别方法)

我目前正在尝试使用http://sudzc.com/中的一些生成代码. 这段代码并不完全适合我的Web服务,因此我尝试将类别添加到一些生成的类中,并使用原始类替换它们的实现来自"objc/runtime.h"的method_exchangeImplementations.(我可以直接修改生成的代码,但我想避免它).

这是我在MyAppAppDelegate中执行的代码 - applicationDidFinishLaunching方法

Class theClass = [CBMayaIPhoneUser class];
Method originalMethod = class_getClassMethod(theClass, @selector(initWithNode:));
Method categoryMethod = class_getClassMethod(theClass, @selector(initWithAllStringNode:));
method_exchangeImplementations(originalMethod, categoryMethod);

theClass = [Soap class];
originalMethod = class_getClassMethod(theClass, @selector(getNodeValue:withName:));
categoryMethod = class_getClassMethod(theClass, @selector(getHrefNodeValue:withName:));
method_exchangeImplementations(originalMethod, categoryMethod);

theClass = [SoapRequest class];
originalMethod = class_getClassMethod(theClass, @selector(send));
categoryMethod = class_getClassMethod(theClass, @selector(sendIgnoringCertificate));
method_exchangeImplementations(originalMethod, categoryMethod);
originalMethod = class_getClassMethod(theClass, @selector(connectionDidFinishLoading:));
categoryMethod = class_getClassMethod(theClass, @selector(connectionDidFinishLoadingAndSentBody:));
method_exchangeImplementations(originalMethod, categoryMethod);
Run Code Online (Sandbox Code Playgroud)

正如我的问题所述,几乎所有这些class_getClassMethod都返回nil ...我使用了调试器,所以我知道'theClass'是正确设置的.找到的唯一方法是Soap类,它们都是类级(+)方法.但是从网上的各种例子中我得出的结论是,它也适用于其他人......

以下是MyAppAppDelegate.m的包含:

#import "MyAppAppDelegate.h"
#import "RootViewController.h"
#import "MyGlobalVariables.h"
#import "MyWebServiceExample.h"
#import "Soap+Href.h"
#import "SoapRequest+Certificate.h"
#import "CBMayaIPhoneUser+AllString.h"
#import …
Run Code Online (Sandbox Code Playgroud)

implementation exchange-server objective-c-runtime ios-simulator

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

在Objective-C中在运行时创建类有什么意义?

我最近重读了Mike Ash关于如何在Objective-C Runtime创建类的有趣教程

我很长一段时间,我想知道在哪里应用这种强大的语言功能.对于我脑海中出现的大多数想法,我总是看到一个过度的解决方案,最终我会继续NSDictionary.在运行时使用创建类的情况是什么?我看到的唯一一个是Obj-C翻译......更多想法?

runtime objective-c objective-c-runtime ios

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

为什么method_getNumberOfArguments返回的结果比选择器所暗示的多两个?

在objective-C运行时,为什么method_getNumberOfArguments返回的结果比选择器所暗示的多两个?

例如,为什么@selector(initWithPrice:color :)返回4?

objective-c objective-c-runtime

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

iOS:如何以编程方式循环遍历类对象的对象/属性(非UI元素)

我正在尝试NSLog,viewController的对象/属性.

我已经开始循环子视图,超级视图(基本上是UIElements),如下面的代码

@interface ViewController : UIViewController 

{
NSString *string;
NSMutableArray *mutableArray ;
NSMutableDictionary *mutableDictionary;    
}
@property NSString *string;
@property NSMutableArray *mutableArray ;
@property NSMutableDictionary *mutableDictionary; 


@implementation ViewController

-(void) loopThrough{
  for (id obj in [self.view subviews]) {
    nslog(@"This would print subviews properties%@", obj)
}
Run Code Online (Sandbox Code Playgroud)

}

我的问题与上面类似,可以循环遍历非UI元素集NSString,NSArray等,

Implementation Scenario
我在viewController中有4个网络调用超时计时器,当一个网络调用成功时,必须禁用超时计时器.但由于发生了四次网络调用,我不想声明viewController的4个定时器全局变量,并分别使每个定时器无效.相反,我想循环并使计时器无效.

iphone objective-c nslog objective-c-runtime ios

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

有没有简单的方法在所有方法中添加NSLog或任何日志记录语句?

我即将完成项目,我想在其中添加日志记录.我知道市场上有一些好的记录器(CocoaLumberjack).但为此,我需要将log语句添加到每个方法中.随着项目即将完成,有很多方法.那么,有什么方法或解决方法吗?不将log语句添加到所有方法中如果我将添加到任何中心位置,它将适用于所有方法.

我不确定是否Objective-C在每个方法之前调用了这样的运行时函数.

这种方法对我这样的所有情况都有帮助,或者任何新的dev正在编写新方法,然后他不需要记住添加日志语句.

编辑:

这仅用于调试目的.我将添加一种控制日志的方法,如关闭和打印某个级别的详细信息.

objective-c objective-c-runtime ios

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

为什么isKindOfClass和isMemberOfClass与NSString和NSMutableString一起工作不好?

我知道Apple警告不要使用它.但鉴于他们的推理,结果远非相关和预期.

这是我的调试输出 - 代码中的结果没有区别 - 下面只是为了简洁:

(lldb) po [@"Hello" isKindOfClass:[NSMutableString class]]
true => A mutable string?

(lldb) po [[@"Hello" mutableCopy] isKindOfClass:[NSMutableString class]]
0x00000001019f3201   => What's that?

(lldb) po [[@"Hello" mutableCopy] isMemberOfClass:[NSMutableString class]]
0x000000010214e400   => What's that?

(lldb) po [@"Hello" isMemberOfClass:[NSMutableString class]]
false  => Once again?
Run Code Online (Sandbox Code Playgroud)

除此之外,我删除了所有字符串文字代码并测试了以下内容:

NSMutableString * m = [[NSMutableString alloc] initWithString:@"Hello"];

bool b = [m isKindOfClass:[NSMutableString class]];
NSLog(@"%d", b); --> 1 Expected.
b = [m isKindOfClass:[NSString class]];
NSLog(@"%d", b); --> 1 Expected.
b = [m isMemberOfClass:[NSString …
Run Code Online (Sandbox Code Playgroud)

class objective-c-runtime nsstring nsmutablestring ios

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