我有一个正在转发接收消息的对象。它没有实现使用forwardInvocation. 但是,methodSignatureForSelector由于程序的组织方式,在某些时候不会总是返回有效的方法签名。如何吞下由缺少的方法签名生成的异常?覆盖doesNotRecognizeSelector不起作用。谢谢。
objective-c objective-c-runtime message-forwarding nsinvocation
中Objective-C,如何获取元类对象?二者[self class]并[ClassName class]只返回类对象。
Swift/Objective-c 新手,具有 Java、C# 和 C++ 背景。我的理解是,如果代码是非本机的,就像 Java 或 C# 一样,会生成中间代码,在运行时需要一个将代码转换为机器语言的环境,我们称之为运行时环境(例如JRE)。
因此,在阅读了有关堆栈溢出的一些 Q 和 As 后,很明显 Swift 和 Objective-C 都被编译为本机二进制文件。但它们需要 Objective-C 运行时来执行它们。
我不知道如果代码已经是机器语言,为什么还需要运行时?
它就像一个链接到程序的库吗?
或者这个 Objective-C 运行时是托管 Objective-C/Swift 程序的单独环境吗?就像 JRE 一样?
有人可以解释一下吗?
谢谢,艾哈迈德
有以下例子:
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 …
我目前正在尝试使用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
我最近重读了Mike Ash关于如何在Objective-C Runtime创建类的有趣教程
我很长一段时间,我想知道在哪里应用这种强大的语言功能.对于我脑海中出现的大多数想法,我总是看到一个过度的解决方案,最终我会继续NSDictionary.在运行时使用创建类的情况是什么?我看到的唯一一个是Obj-C翻译......更多想法?
在objective-C运行时,为什么method_getNumberOfArguments返回的结果比选择器所暗示的多两个?
例如,为什么@selector(initWithPrice:color :)返回4?
我正在尝试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个定时器全局变量,并分别使每个定时器无效.相反,我想循环并使计时器无效.
我即将完成项目,我想在其中添加日志记录.我知道市场上有一些好的记录器(CocoaLumberjack).但为此,我需要将log语句添加到每个方法中.随着项目即将完成,有很多方法.那么,有什么方法或解决方法吗?不将log语句添加到所有方法中如果我将添加到任何中心位置,它将适用于所有方法.
我不确定是否Objective-C在每个方法之前调用了这样的运行时函数.
这种方法对我这样的所有情况都有帮助,或者任何新的dev正在编写新方法,然后他不需要记住添加日志语句.
编辑:
这仅用于调试目的.我将添加一种控制日志的方法,如关闭和打印某个级别的详细信息.
我知道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) objective-c ×7
ios ×4
class ×1
iphone ×1
metaclass ×1
nsinvocation ×1
nslog ×1
nsstring ×1
runtime ×1
swift ×1