小编Lom*_*baX的帖子

使用Swift子类UIApplication

在Objective C中很简单:更新main.m文件并更改UIApplicationMain()参数就足够了

return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));
Run Code Online (Sandbox Code Playgroud)

但是在swift中没有main.m文件,因为指南说

"在全局范围编写的代码用作程序的入口点,因此您不需要主函数."

那么,如何在swift中继承UIApplication?有什么建议吗?

cocoa-touch ios swift

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

从Swift中的String调用方法

从名称(以String格式)调用方法有时很有用.
在Swift中,建议改变行为并使用闭包来"动态地"执行某些操作,因此例如,您可以使用函数字典,将名称作为键,将实现作为值.
但是,有时你想简单地知道"怎么做",这就是这个问题的原因.
那么,如何从名称作为字符串开始动态调用Swift方法?

在Objective C中它很简单:

[self performSelector:NSSelectorFromString(@"aSelector")];
Run Code Online (Sandbox Code Playgroud)

performSelector在Swift中被禁止
有没有其他选择?

swift

40
推荐指数
3
解决办法
2万
查看次数

自定义对象的UIAppearance代理

我有一个自定义对象,它继承自NSObject.这个对象做了"一些事情",其中一个是用一些UIKit对象创建一个UIView(UILabel,UIButtons ecc ecc ...).此对象具有一些属性,如:textColor,font,backgroundColor ...,用于自定义包含的UIKit对象的外观.

我想为这个对象的所有创建实例定制这个属性"一次性",我已经看了UIAppearance协议.

标准UIKit对象已经符合UIAppearance协议,但我不想在所有UILabel或UIButtons上应用该样式.我想仅将样式应用于对象实例中包含的UILabel和UIButtons.而且,我不能(我不想)使用appearanceWhenContainedIn:因为使用我的自定义对象的开发人员可能不知道它内部包含什么类型的对象.

所以,我正在研究如何使我的自定义对象符合UIAppearance协议.

它必须实现AFAIK

+ (id)appearance
Run Code Online (Sandbox Code Playgroud)

方法.此方法应返回一个代理对象,您可以在其中发送所有自定义项.但是,看一下UIKit对象的外观方法,我发现返回了一个私有对象.类_UIAppearance的对象.

所以,似乎Apple没有给我一个标准的代理对象来定制我自己的,我必须从头开始创建.是对的还是我失去了什么?

谢谢

objective-c ios uiappearance

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

当用户默认为空时,Swift和NSUserDefaults - EXC_BAD_INSTRUCTION

我正在将我的一个项目转换为Swift,逐个文件.我对NSUserDefaults有一种奇怪的行为.我使用NSString而不是String来与其他代码兼容

var selectedMonth : NSString {
get {
    return NSUserDefaults.standardUserDefaults().objectForKey(AppUserDefaults.SelectedMonth.value()) as NSString
}
set {
    NSUserDefaults.standardUserDefaults().setObject(self, forKey: AppUserDefaults.SelectedMonth.value())
    NSUserDefaults.standardUserDefaults().synchronize()
}
}
Run Code Online (Sandbox Code Playgroud)

该方法适用于获取/设置属性,但是当第一次执行应用程序并且用户默认值为空时,我收到EXC_BAD_INSTRUCTION错误return NSUserDefaults.standardUserDefaults().objectForKey(AppUserDefaults.SelectedMonth.value()) as NSString

问题不在于回报,因为我可以"扩展"这句话:

    let defaultKey = AppUserDefaults.SelectedMonth.value()
    let defaults = NSUserDefaults.standardUserDefaults()  // defaults is correctly set
    let result : AnyObject = defaults.objectForKey(defaultKey)  // <-- the error is here
    return result as NSString
Run Code Online (Sandbox Code Playgroud)

目标C中的类似语句正常工作,返回nil,但我看到objectForKeyswift 中的声明是

func objectForKey(defaultName: String!) -> AnyObject!
Run Code Online (Sandbox Code Playgroud)

注意最后的感叹号,似乎必须从函数返回一个对象,但我认为正确的声明(使它像objc一样工作)应该以?结尾?所以我认为行为发生了变化,并没有写在文档中.

你认为这是一个错误(所以我会提交)或者我错过了什么?谢谢

ios swift

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

核心数据内存使用和内存警告

我有这个问题.我在Core Data中有一个图像数据库.我获取所有图像(大约80MB)并放入NSMutableArray.对象是正确的错误:

NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:request error:&error];
self.cache = [NSMutableArray arrayWithArray:fetchResults];
for (ImageCache *imageObject in self.cache) {
    NSLog(@"Is fault? %i", [imageObject isFault]);
}
Run Code Online (Sandbox Code Playgroud)

阅读日志,我看到对象都是正确的故障然而,使用Instruments,我看到使用了80MB的内存.我认为这就是为什么Core Data会缓存它的结果,并且应该在需要时释放内存.但是(这是我的"问题"),如果我模拟一个内存警告,没有任何反应!80MB仍在那里.

看看仪器 - 分配,许多Malloc使用80MB :(示例)

图表类别实时字节#Living#Transitory Total Bytes#Overall#Allocations(Net/Overall)0 Malloc 176,00 KB 8,59 MB 50 57 18,39 MB 107%0.00,%0.00 0 Malloc 200,00 KB 8,20 MB 42 460 98,05 MB 502%0.00,%0.04 0 Malloc 168,00 KB 7,05 MB 43 19 10,17 MB 62%0.00,%0.00

这是指向整个呼叫树图像的链接:https://www.dropbox.com/s/du1b5a5wooif4w7/Call%20Tree.png

有任何想法吗?谢谢

xcode memory-management core-data objective-c ios

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

NSURLSession invalidateAndCancel:访问不良

当我尝试使NSURLSession实例无效时,我遇到了一个奇怪的问题.代码非常简单:我有一个View Controller,两个按钮(start:和stop :),以及一个url的文本字段.

一个简单的代码摘录:

- (IBAction)start:(id)sender {
    NSURLSessionConfiguration *conf = [NSURLSessionConfiguration backgroundSessionConfiguration:@"conf"];
    self.session = [NSURLSession sessionWithConfiguration:conf delegate:self delegateQueue:nil];
    NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.url.text]]];
    [task resume];
}

- (IBAction)cancel:(id)sender {

    [self.session invalidateAndCancel];
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,整个项目:链接

现在,尝试下载文件(http://download.thinkbroadband.com/1GB.zip).

由于我希望此下载在后台继续,我正在使用后台会话.
会话正确启动,下载在后台继续,但如果我尝试取消它(发送invalidateAndCancel),我的访问权限很差.
启用Zombie的分析给出了这个僵尸对象:_NSCFBackgroundDownloadTask.
因此,如果我保留NSURLSessionDownloadTask(使用强大的属性来存储它),则不会发生错误访问.但是,AFAIK,NSURLSession应该保留它自己的任务,所以我想了解我的代码有什么问题(也许我在文档中遗漏了什么?)或者我应该提交bug报告.

谢谢

memory-management exc-bad-access ios ios7 nsurlsession

9
推荐指数
2
解决办法
7910
查看次数

Swift和方法原型 - 前向声明

探索Swift标题我看到Apple使用的这种模式,特别是以下结构的init声明没有实现.显然init()实现是以某种方式隐藏的,因为它是Apple的东西,但我试图理解如何.这只是一个示例,但它似乎是标题中的常见行为

struct AutoreleasingUnsafePointer<T> : Equatable, LogicValue {
    let value: Builtin.RawPointer
    init(_ value: Builtin.RawPointer)    // <---- how is it possible? where is the implementation?
    func getLogicValue() -> Bool

    /// Access the underlying raw memory, getting and
    /// setting values.
    var memory: T

}
Run Code Online (Sandbox Code Playgroud)

我知道可以声明一个协议加上一个类扩展,这样就可以从类声明中"隐藏"实现并将其移动到别处

class TestClass :TestClassProtocol
{
     // nothing here

}

protocol TestClassProtocol
{
    func someMethod()  // here is the method declaration

}

extension TestClass
{
    func someMethod()  // here is the method implementation
    {
        println("extended method")
    }

}
Run Code Online (Sandbox Code Playgroud)

但它与我在Apple …

ios swift

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

containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上提供不同的结果

我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOS Target,Watchkit App Target和Watchkit App Extension Target添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOS App和WatchKit Extension访问共享文件夹URL:

延期:

@implementation ExtensionDelegate

- (void)applicationDidFinishLaunching {
    // Perform any final initialization of your application.
    NSURL *test = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.lombax.fiveminutes"];
}
Run Code Online (Sandbox Code Playgroud)

iOS应用:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    NSURL *test = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.lombax.fiveminutes"];
// ... 
}
Run Code Online (Sandbox Code Playgroud)

但是,testNSURL是不同的:

在iOS上:

文件:///用户/ Lombardo的/库/开发商/ CoreSimulator /设备/ 38B983DB-342F-4A47-8C26-5D2C92CDB666 /数据/容器/共享/ AppGroup/8DEE182E-AFE6-47DD-BA2B-6B0520158A8B /

观看:

文件:///用户/ Lombardo的/库/开发商/ CoreSimulator /设备/ BF52D613-25FF-4092-A5B2-9C3F1B616160 /数据/容器/共享/ AppGroup/CECB5EFC-7FBD-4C84-A878-1314CB7CF211 /

因此我无法在iOS App和WatchKit Extension之间共享数据.

因为我的Apple Watch上没有WatchOS …

iphone ios ios-simulator apple-watch watchkit

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

debug:获取对象的所有实例变量的列表(未知类型)

是否有任何方法可以获取(通过调试)Objective-c中未知对象的所有实例变量的列表?

我使用lldb进行调试,但我承认我不太了解它.

显然我无法查看这个未知对象的标题.

我需要在调试时执行此操作,但如果不可能,我可以在运行时使用替代方法.

我发现这篇文章:如何在Objective-C中列出对象的所有字段?但是,据我所知,我需要一个已知的类(我需要对象的标题)

有什么建议吗?

debugging gdb objective-c lldb

5
推荐指数
2
解决办法
3031
查看次数

调用具有可变参数的方法并转发消息 - Bad Access

我正在实现一个"Code Injector Class",通过方法调配可以让你做到这样的事情:

FLCodeInjector *injector = [FLCodeInjector injectorForClass:[self class]];
[injector injectCodeBeforeSelector:@selector(aSelector:) code:^{
    NSLog(@"This code should be injected");
}];
Run Code Online (Sandbox Code Playgroud)

aSelector可以是具有可变数量的参数和变量返回类型的方法.参数/和返回类型可以是对象或基本类型.

首先,我附上代码,injectCodeBeforeSelector:让你了解我在做什么(我删除了代码的有趣部分):

- (void)injectCodeBeforeSelector:(SEL)method code:(void (^)())completionBlock
{

    NSString *selector = NSStringFromSelector(method);

    [self.dictionaryOfBlocks setObject:completionBlock forKey:selector];

    NSString *swizzleSelector = [NSString stringWithFormat:@"SWZ%@", selector];

    // add a new method to the swizzled class
    Method origMethod = class_getInstanceMethod(self.mainClass, NSSelectorFromString(selector));
    const char *encoding = method_getTypeEncoding(origMethod);

    [self addSelector:NSSelectorFromString(swizzleSelector) toClass:self.mainClass methodTypeEncoding:encoding];
    SwizzleMe(self.mainClass, NSSelectorFromString(selector), NSSelectorFromString(swizzleSelector));

}

-(void)addSelector:(SEL)selector toClass:(Class)aClass methodTypeEncoding:(const char *)encoding
{
    class_addMethod(aClass,
                    selector,
                    (IMP)genericFunction, encoding);
}
Run Code Online (Sandbox Code Playgroud)

基本上,我使用class_addMethod将伪/ …

objective-c variadic-functions objective-c-runtime swizzling ios

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

最新测试版中的Swift C void*和void**指针(4)

在以前的测试版中,我能够将指向任何东西的指针传递给C做类似的事情

var aString : NSString = "This is a string" // create an NSString
var anUnmanaged = Unmanaged.passUnretained(aString) // take an unmanaged pointer
var opaque : COpaquePointer = anUnmanaged.toOpaque() // convert it to a COpaquePointer
var mut : CMutablePointer = &opaque // this is a CMutablePointer
doSomething(mut) // pass the pointer to an helper function written in C
Run Code Online (Sandbox Code Playgroud)

使用C函数如下:

void doSomething(void ** ptr)
{
   // do something with the pointer, change it and make it point to another nsstring for …
Run Code Online (Sandbox Code Playgroud)

c swift

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

Typescript 和 React,React.KeyboardEvent&lt;HTMLInputElement&gt; 编译时和运行时之间的不同类型

TL;DRObject.getPrototypeOf(e.target)返回HTMLInputElement,但编译器说该类型是EventTarget

Long:我有一个简单的输入

      <input
        className="FilterInput"
        type="text"
        placeholder="Search for names..."
        onKeyUp={filter}
      />
Run Code Online (Sandbox Code Playgroud)

以及管理过滤器的功能

    const filter = (e: React.KeyboardEvent<HTMLInputElement>) => {
        console.log(Object.getPrototypeOf(e.target)) // prints "HTMLInputElement"
        console.log((e.target as HTMLInputElement).value);
        // ... other code
    }
Run Code Online (Sandbox Code Playgroud)

我试图更好地理解 Typescript 类型管理背后的理论,但是我不明白为什么我必须输入提示

(e.target as HTMLInputElement).value

在第二console.log

如果我不这样做,编译器(编译时)会说Property 'value' does not exist on type 'EventTarget'.。所以这意味着在编译时的类型e.target是EventTarget。

但是,在运行时使用 进行测试时Object.getPrototypeOf(e.target),类型为HTMLInputElement(具有该value属性)。

为什么会发生这种情况?这是我的代码中的错误吗?是与 React 有关的错误,还是我缺少的 Typescript 类型管理理论的某些部分?

此外,参数声明中的泛型类型指示(例如:React.KeyboardEvent< HTMLInputElement >)难道还不够吗?

谢谢

type-inference typescript reactjs

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