是否存在与C++的dynamic_cast相当的Objective-C?
它可以用这个伪造:
MyClass *safeObject = [object isKindOfClass: [MyClass class]]
? (MyClass *)originalObject : nil;
Run Code Online (Sandbox Code Playgroud)
但即使我不需要经常输入,也需要输入很多代码.
我有点生疏,所以这可能不太正确,但我相信C++中的等价物将是:
MyClass safeObject = dynamic_cast<MyClass>(orginalObject);
Run Code Online (Sandbox Code Playgroud)
这里的上下文是一个块,其中参数被定义为更通用的类的类型,但在这个块中我"知道"它是一个特定的子类.尽管如此,我不想盲目地抛弃它(MyClass *)originalObject而忽略理论上可能出现的错误.
要明确的是,虽然我喜欢a dynamic_cast,但我也很乐意采用另一种方法来安全地处理这种情况.
我更喜欢使用与TestFlight和App Store相同的构建配置.有没有办法在运行时检测应用程序是否已通过TestFlight或App Store安装?(我的想法是,takeOff如果没有通过App Store安装,我只会打电话.)
我想避免在App Store版本中使用TestFlight来保护我的用户的隐私,并避免这里讨论的网络的潜在脱轨.
我有一个视图控制器子类,SignInViewController用于登录,可能随时需要.而不是让我的应用程序中的每个视图控制器都听取需要登录的通知,我宁愿让应用程序代理执行此操作.
但是如何从我的应用代表中触发它呢?
我把它SignInViewController放在我的主要故事板中吗?如果是这样,我如何从我的应用代表访问我的故事板?还是其他一些方法更好?
我已经创建了一个测试项目,我正在测试我的假设,NSOperation并NSOperationQueue在我的主项目中使用它们之前.
我的代码非常简单,所以我将在这里包含所有内容.这是在启用ARC的情况下使用命令行Foundation项目.
#import <Foundation/Foundation.h>
@interface Operation : NSOperation
@property (readwrite, strong) NSString *label;
- (id)initWithLabel: (NSString *)label;
@end
Run Code Online (Sandbox Code Playgroud)
#import "Operation.h"
@implementation Operation
- (void)main
{
NSLog( @"Operation %@", _label);
}
- (id)initWithLabel: (NSString *)label
{
if (( self = [super init] )) {
_label = label;
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
#import <Foundation/Foundation.h>
#import "Operation.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = …Run Code Online (Sandbox Code Playgroud) 更新:回答下面的问题,感谢格雷格帕克的指针......
我在这里上传了一个示例项目,但我也会对其进行描述:https://github.com/tewha/getsectbyname-crash
我从我的(仅64位)可执行文件中崩溃,但从Xcode运行时却没有.但是,如果我从终端或仪器运行它,它会崩溃.
这不是 Debug vs. Release配置问题; 在终端中运行Debug可执行文件也崩溃了.从Xcode运行Release可执行文件.
我正在尝试从Mach-O可执行文件中读取一个链接到app的可执行部分CREATE_INFOPLIST_SECTION_IN_BINARY = YES.
const struct section_64 *plistSection = getsectbyname("__TEXT", "__info_plist");
NSLog(@"Found a section %s, %s", plistSection->segname, plistSection->sectname);
void *ptr = ((void *)plistSection->addr);
uint64_t size = plistSection->size;
NSLog(@"It has %zd bytes at %tx", size, plistSection->addr);
NSLog(@"Allocating %zd bytes", size);
void *buffer = malloc(size);
NSLog(@"Moving %zd bytes", size);
NSLog(@"(Crashes when doing the memmove.)");
memmove(buffer, ptr, size);
NSLog(@"Freeing %zd bytes", size);
free(buffer); …Run Code Online (Sandbox Code Playgroud) 我需要在代码中将我的日期选择器最小日期设置为今天吗?
当我尝试在iOS 4.3模拟器(Xcode 4.2)中运行我的应用程序时,当我点击@autoreleasepool {}时,我崩溃了:
dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush
Run Code Online (Sandbox Code Playgroud)
我环顾四周,看到解决方法是添加libarclite_iphoneos.a.这也是模拟器的一个版本,如libarclite_iphonesimulator.a.
我需要将两个库添加到我的项目中,以使其在模拟器和硬件上运行.但无论我构建哪个,它都会抱怨另一个库是针对不受支持的架构的.
例如,为模拟器构建:
ld: warning: ignoring file /Developer-4.2/Platforms/iPhoneOS.platform/
Developer/usr/lib/arc/libarclite_iphoneos.a, missing required architecture
i386 in file
Run Code Online (Sandbox Code Playgroud)
我如何同时修复这两个?或者我NSAutoreleasePool现在应该坚持使用旧语法?
我applicationShouldOpenUntitledFile向我的应用程序委托添加了一个方法,返回NOApple的文档指定.但是,我仍然在启动时获得一份新文档.怎么了?
@implementation AppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSLog( @"This is being called" );
}
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
NSLog( @"This never is" );
return NO;
}
@end
Run Code Online (Sandbox Code Playgroud) 有没有办法自定义我的应用程序尝试访问通讯簿时显示的提示?
我想补充说明我使用的数据,以及为什么需要它.
当您打印NSThread的描述时,您会得到如下内容:
<NSThread: 0x1e511b70>{name = (null), num = 1}
Run Code Online (Sandbox Code Playgroud)
这个"数字"是否以某种方式可用?
这仅用于调试,因此无需清除Apple的批准过程.
ios ×5
cocoa ×2
cocoa-touch ×2
macos ×2
app-store ×1
appkit ×1
datepicker ×1
debugging ×1
ios4 ×1
ios5 ×1
ios6 ×1
iphone ×1
mach-o ×1
nsthread ×1
objective-c ×1
testflight ×1
uistoryboard ×1