我正在尝试为我的 Web 视图显示错误消息,并且我需要知道不可用的 url,因此我实现了委托方法:
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
[self.addressBar finishLoadingProgressAnimated:YES];
NSLog(@"%@", webView.URL);
[self showErrorPageForURL:error.userInfo[NSErrorFailingURLStringKey]];
}
Run Code Online (Sandbox Code Playgroud)
但是 NSErrorFailingURLStringKey 已被弃用,那么如何获取失败的 URL?WKNavigation的界面是空的。此时 webView.URL == nil 。
objc_setAssociatedObject
用于类对象是否正确?
我们经常使用类似的静态变量来模拟类变量: Objective C Static Class Level变量 但是,我们可以使用Associated对象作为替代吗?
objc_setAssociatedObject([self class], &STRING_KEY, myString, OBJC_ASSOCIATION_RETAIN);
Run Code Online (Sandbox Code Playgroud) 从objc来源我们可以看到SEL
定义为typedef struct objc_selector *SEL;
我用idaq反汇编我的dylib ,并且我确实调用了_MSHookMessageEx
函数,它是从libsubstrate.dylib链接的
_MSHookMessageEx
有以下签名
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
Run Code Online (Sandbox Code Playgroud)
所以我们可以假设在源代码中有类似@selector(someMethod:)
第二个参数的东西
在目标文件的数据部分,我可以看到源代码中使用的所有CFStrings
但是这里没有任何选择器字符串,所以我们可以看到它@selector()
没有转换成静态CFString
我很感兴趣找到传递给_MSHookMessageEx
函数的选择器和类的String表示.
如何从目标文件(Mach-o)获取SEL(@selector())?SEL如何存储在Mach-o中?
谢谢!
更新:
我确实在调用方法之前在ida方法表示中有一些字符串
我猜有些选择器传入函数.我对吗?
我创建了这样的新叠加层:
MKCircle *circle = [MKCircle circleWithCenterCoordinate:region.coordinate radius:region.radius];
[self.mapView addOverlay:circle];
Run Code Online (Sandbox Code Playgroud)
我也实现了委托方法:
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
MKCircleRenderer *circleRenderer = [[MKCircleRenderer alloc] init];
circleRenderer.fillColor = [UIColor greenColor];
circleRenderer.alpha = 1.f;
return circleRenderer;
}
Run Code Online (Sandbox Code Playgroud)
代码的两个部分都被调用了,mapView!= nil当时,它是委托集,但是我在地图上看不到圆圈.
我究竟做错了什么?
我可以让我的UIView @property可以检查吗?
@interface Superview : UIView
@property (nonatomic, weak, readonly) IBInspectable UIButton *stopButton;
@property (nonatomic, weak, readonly) IBInspectable PKCircleProgressView *circleProgressView;
@end
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个可设计的视图PKCircleProgressView,我希望它可以从IB编辑.此外,我创建了另一个可设计的视图,其中包含PKCircleProgressView作为子视图,我希望它也可以编辑.
如果我在IB中使用Superview,有没有办法编辑circleProgressView的属性?
我只想出一个想法,为两个视图创建一个通用协议,并实现如下方法:
- (void)setProgress:(CGFloat)progress {
self.circleProgressView.progress = progress;
}
Run Code Online (Sandbox Code Playgroud)
但是对每个属性都不容易,特别是如果我想创建另一个包含我的Superview的View.
我正试图坚持新的实体:
- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
NSMutableArray *mutableArray = [NSMutableArray array];
[Quiz MR_truncateAll];
[[NSManagedObjectContext MR_context] MR_saveWithBlock:^(NSManagedObjectContext *localContext) {
for (NSDictionary *dictionary in quizzess) {
Quiz *quiz = [Quiz MR_createEntity];
[quiz fromDictionary:dictionary];
[mutableArray addObject:quiz];
}
} completion:^(BOOL contextDidSave, NSError *error) {
BlockSafeRun(completion, mutableArray, contextDidSave, error);
}];
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
NSMutableArray *mutableArray = [NSMutableArray array];
[Quiz MR_truncateAll];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
for (NSDictionary *dictionary in quizzess) {
Quiz …
Run Code Online (Sandbox Code Playgroud) 我知道我可以dispatch_async
和和异步执行任务dispatch_get_global_queue
.
但dispatch_async创建了多少个线程?我该怎么做才能用GCD执行完全N(不多也不少)的线程,并对它们执行一些任务?执行任务后,我需要在已发布的线程中添加新任务,可能在前一任务的complitation块中.
或者也许我可以控制荆棘的数量NSOperationQueue
?我知道它有属性maxConcurrentOperationCount
,但它只控制任务的最大限制.那么,我可以确定NSOperationQueue创建了不少于8个线程,以防我设置maxConcurrentOperationCount = 8并将12个操作添加到NSOperationQueue
?
非常感谢你!
iphone multithreading asynchronous grand-central-dispatch ios
我有指向X509结构的指针,我想将它转换为字符串,我该怎么做?我需要得到像PEM_write_X509
函数中打印的字符串.
-----BEGIN CERTIFICATE-----
MIIIxjCCB66gAwIBAgIKah4k3wAAAAC/WTANBgkqhkiG9w0BAQUFADBbMRIwEAYK
CZImiZPyLGQBGRYCcnUxFjAUBgoJkiaJk/IsZAEZFgZ5YW5kZXgxEjAQBgoJkiaJ
k/IsZAEZFgJsZDEZMBcGA1UEAxMQWWFuZGV4RXh0ZXJuYWxDQTAeFw0xMjA5MDQx
NDEzMDhaFw0xNDAxMTcxNTE1NDZaMIGQMQswCQYDVQQGEwJSVTEPMA0GA1UECBMG
UnVzc2lhMQ8wDQYDVQQHEwZNb3Njb3cxDzANBgNVBAoTBllhbmRleDEMMAoGA1UE
CxMDSVRPMRQwEgYDVQQDEwtZYW5kZXggU2VycDEqMCgGCSqGSIb3DQEJARYbc2Vh
cmNoLWFkbWluQHlhbmRleC10ZWFtLnJ1MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
iQKBgQDBXfluaCox4R4D2Y/3mc6O9i3koHtGtHZmZjYm7XdsAA5xsOZAonLReJCL
J8BtgS6McmX9cGa9GF9ErxfWODC+1Wb3yayUNzOhr2ICu3T++ttf0aMVvMTeDF/Y
lfoZ+tgg1ITQ9yVtz7eteodjLNAy6AaC0z7ulSq4jvPbm1WuBQIDAQABo4IF2DCC
BdQwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBaAwggRbBgNVHREEggRSMIIEToIJ
eWFuZGV4LmJ5ggp5YW5kZXguY29tgg15YW5kZXguY29tLnRygg15YW5kZXguY29t
LnVhggl5YW5kZXgua3qCC3lhbmRleC5tb2Jpggp5YW5kZXgubmV0ggl5YW5kZXgu
cnWCCXlhbmRleC5zdIIJeWFuZGV4LnVhghBpbWFnZXMueWFuZGV4LmJ5ghFpbWFn
ZXMueWFuZGV4LmNvbYIUaW1hZ2VzLnlhbmRleC5jb20udHKCFGltYWdlcy55YW5k
ZXguY29tLnVhghBpbWFnZXMueWFuZGV4Lmt6ghJpbWFnZXMueWFuZGV4Lm1vYmmC
EWltYWdlcy55YW5kZXgubmV0ghBpbWFnZXMueWFuZGV4LnJ1ghBpbWFnZXMueWFu
ZGV4LnN0ghBpbWFnZXMueWFuZGV4LnVhghBwZW9wbGUueWFuZGV4LmJ5ghFwZW9w
bGUueWFuZGV4LmNvbYIUcGVvcGxlLnlhbmRleC5jb20udHKCFHBlb3BsZS55YW5k
ZXguY29tLnVhghBwZW9wbGUueWFuZGV4Lmt6ghJwZW9wbGUueWFuZGV4Lm1vYmmC
EXBlb3BsZS55YW5kZXgubmV0ghBwZW9wbGUueWFuZGV4LnJ1ghBwZW9wbGUueWFu
ZGV4LnN0ghBwZW9wbGUueWFuZGV4LnVhghZwZW9wbGVzZWFyY2gueWFuZGV4LmJ5
ghdwZW9wbGVzZWFyY2gueWFuZGV4LmNvbYIacGVvcGxlc2VhcmNoLnlhbmRleC5j
b20udHKCGnBlb3BsZXNlYXJjaC55YW5kZXguY29tLnVhghZwZW9wbGVzZWFyY2gu
eWFuZGV4Lmt6ghhwZW9wbGVzZWFyY2gueWFuZGV4Lm1vYmmCF3Blb3BsZXNlYXJj
aC55YW5kZXgubmV0ghZwZW9wbGVzZWFyY2gueWFuZGV4LnJ1ghZwZW9wbGVzZWFy
Y2gueWFuZGV4LnN0ghZwZW9wbGVzZWFyY2gueWFuZGV4LnVhgg92aWRlby55YW5k
ZXguYnmCEHZpZGVvLnlhbmRleC5jb22CE3ZpZGVvLnlhbmRleC5jb20udHKCE3Zp
ZGVvLnlhbmRleC5jb20udWGCD3ZpZGVvLnlhbmRleC5reoIRdmlkZW8ueWFuZGV4
Lm1vYmmCEHZpZGVvLnlhbmRleC5uZXSCD3ZpZGVvLnlhbmRleC5ydYIPdmlkZW8u
eWFuZGV4LnN0gg92aWRlby55YW5kZXgudWGCDXd3dy55YW5kZXguYnmCDnd3dy55
YW5kZXguY29tghF3d3cueWFuZGV4LmNvbS50coIRd3d3LnlhbmRleC5jb20udWGC
DXd3dy55YW5kZXgua3qCD3d3dy55YW5kZXgubW9iaYIOd3d3LnlhbmRleC5uZXSC
DXd3dy55YW5kZXgucnWCDXd3dy55YW5kZXguc3SCDXd3dy55YW5kZXgudWEwHQYD
VR0OBBYEFDjrNQM8dYCWIlusgG7EqlAZ5D9lMB8GA1UdIwQYMBaAFNtBJzBPGvVb
PoRWyOyFmLNRLC0nMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmxzLnlhbmRl
eC5ydS9ZYW5kZXhFeHRlcm5hbENBL1lhbmRleEV4dGVybmFsQ0EuY3JsMFcGCCsG
AQUFBwEBBEswSTBHBggrBgEFBQcwAoY7aHR0cDovL2NybHMueWFuZGV4LnJ1L1lh
bmRleEV4dGVybmFsQ0EvWWFuZGV4RXh0ZXJuYWxDQS5kZXIwPwYJKwYBBAGCNxUH
BDIwMAYoKwYBBAGCNxUIhtyhJoWT1VWH/YEtg/nnAoOV0gQci62jzDeH/MC/KAIB
ZAIBBjATBgNVHSUEDDAKBggrBgEFBQcDATAbBgkrBgEEAYI3FQoEDjAMMAoGCCsG
AQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQDNo4rLhEWgj72wbpYO6lSuM6YHn6Bj
BsXJfumtchTyRHsY8RJGGKGZ6joeOQweqChsQXULTnVzadCJ1VqVJ2lTaII5R8Ii
N9jcYgFl4WOv1ynFJ0Jf3V6/ePQd9cqFFJTfFSODHsyZR/Dhgez81/QExfsG/SzS
u+ACIvsDbyu7NFcAK6ZM5CKz3lcisddT/pSPbTOi7AtqtNTrvKlV2AT+5mfNTEa7
rNv6chVl1He7RW8r7uCkK6AfFb0Z4LDhv2zkvmcUtaojmDOO/2AZSXym8efCSmHr
CL2rhv6+ER3c0x5uJlhAUr1ZM76/XnfvT/2SKekPXbGlVAE3v7tfRnW9
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
我试着PEM_write_X509
在openssl的源代码中查看函数,但是我不能这么做,所以很多宏和定义.
另外,我如何检查证书的类型?它是PEM还是DER?
更新:
struct x509_st
{
X509_CINF *cert_info;
X509_ALGOR *sig_alg;
ASN1_BIT_STRING *signature;
int valid;
int references;
char *name;
CRYPTO_EX_DATA ex_data;
/* These contain copies …
Run Code Online (Sandbox Code Playgroud) 相关链接http://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-ii-libtooling-example
我正在使用CommonOptionsParser
解析clang工具的参数:
// parse the command-line args passed to your code
CommonOptionsParser op(argc, argv);
// create a new Clang Tool instance (a LibTooling environment)
ClangTool Tool(op.getCompilations(), op.getSourcePathList());
// run the Clang Tool, creating a new FrontendAction (explained below)
int result = Tool.run(newFrontendActionFactory<SomeAction>());
Run Code Online (Sandbox Code Playgroud)
和下一个参数:
llvm/Debug+Asserts/bin/mytool /somePath/someSource.mm --
Run Code Online (Sandbox Code Playgroud)
当我在某个源文件上运行我的工具(基于clang libtooling)时,工具尝试查找包含的文件,fe :
#import “SomeClass.h”
,或#import<Foundation/Foundation.h>
如果它找不到标题,则会产生错误:
致命错误:找不到'Foundation/Foundation.h'文件.
你能告诉我,如果你知道,我怎样才能将工具引导到标准框架?我怎样才能将它指向某些标题搜索路径?如何在运行工具时设置标题搜索路径?
当我将块传递给其他方法(而不是用Block_copy
或堆@property(copy)
)时,它是复制还是通过引用传递?
我的意思是:
- (void)processBlock:(MyBlockType)block param:(int)param {
}
- (void)someMethod {
int b1 = 10;
int a1 = 9;
[self processBlock:^int(int number, id object) {
NSLog(@"block");
return 1 + a1;
} param:b1];
}
Run Code Online (Sandbox Code Playgroud)
它是NSStackBlock
- 因为它捕获"a"变量,因此它在堆栈上分配.当我将它们传递给另一个方法时,它是复制并存储在processBlock's
堆栈的一部分,还是仅通过引用传递?
像那样:
copyOf myBlock
copyOf b1
processBlock
..........
..other variables..
a1
b1
myBlock
someMethod
..........
Run Code Online (Sandbox Code Playgroud)
或者像那样:
*myBlock (jast a pointer)
copyOf b1
processBlock
..........
..other variables..
a1
b1
myBlock
someMethod
..........
Run Code Online (Sandbox Code Playgroud) 我创建了C函数:
头
//FileSystem.h file
#import <Foundation/Foundation.h>
BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url);
Run Code Online (Sandbox Code Playgroud)
履行
//FileSystem.mm
#import "FileSystem.h"
#import <sys/xattr.h>
#import <Support/Support.h>
static const char* attrName = "com.apple.MobileBackup";
BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url) {
BOOL operationResult = NO;
// some implementation
return operationResult;
}
Run Code Online (Sandbox Code Playgroud)
当我AddSkipBackupAttributeToItemAtURL
从应用程序的其他部分调用时,一切都很好,除了我从块中调用函数的一个地方.
__block UpdateFileAsyncOperation* selfOperation = self;
_contentDownloader.completionBlock = ^(NSData* data) {
[data saveForcedToPath:selfOperation.filePath];
NSURL* fileUrlWithScheme = [NSURL fileURLWithPath:selfOperation.filePath];
AddSkipBackupAttributeToItemAtURL(fileUrlWithScheme);
[runLoop removePort:port forMode:NSDefaultRunLoopMode];
[selfOperation completeOperation];
};
Run Code Online (Sandbox Code Playgroud)
在那个地方,在进行链接时,有错误:
体系结构i386的未定义符号:
" AddSkipBackupAttributeToItemAtURL",引自:__ 36- [UpdateFileAsyncOperation start] UpdateFileAsyncOperation.o中的_block_invoke ld:未找到架构i386 clang的符号:错误:链接器命令失败,退出代码为1(使用 - v看看调用)
我不明白为什么会发生这种情况,它取决于阻止?我该如何解决这个问题?谢谢!
更新:它不依赖于块,我已将函数调用移到另一个类的地方:错误仍然存在.我想找到原因
ios ×9
iphone ×8
objective-c ×5
c ×2
c++ ×2
uiview ×2
asynchronous ×1
class ×1
compilation ×1
core-data ×1
header-files ×1
ibdesignable ×1
ida ×1
include ×1
keyboard ×1
linker ×1
llvm-clang ×1
mapkit ×1
mkmapview ×1
nsurl ×1
openssl ×1
static ×1
string ×1
wkwebview ×1
x509 ×1