小编ede*_*y05的帖子

NSObject +加载和+初始化 - 它们做什么?

我有兴趣了解导致开发人员覆盖+初始化或+加载的情况.文档清楚地表明Objective-C运行时为您调用了这些方法,但这些方法的文档中确实清楚了.:-)

我的好奇心来自于Apple的示例代码 - MVCNetworking.他们的模型类有一个+(void) applicationStartup方法.它在文件系统上做一些内务处理,读取NSDefaults等等......并且,在尝试了解NSObject的类方法之后,似乎这个清洁工作可能可以放入+ load.

我确实修改了MVCNetworking项目,将App Delegate中的调用删除到+ applicationStartup,并将管家位置放入+ load ...我的计算机没有着火,但这并不意味着它是正确的!我希望能够理解你需要调用的自定义设置方法与+ load或+ initialize之间的任何细微之处,陷阱和其他内容.


对于+ load文档说:

加载消息将发送到动态加载和静态链接的类和类别,但前提是新加载的类或类别实现了可以响应的方法.

如果你不知道所有单词的确切含义,那么这句话很难解析.救命!

  • 什么是"动态加载和静态链接?" 某些东西可以动态加载和静态链接,还是它们是互斥的?

  • "......新加载的类或类实现了一个可以响应的方法"什么方法?回应怎么样?


至于+ initialize,文档说:

初始化它每个类只调用一次.如果要对类和类的类别执行独立初始化,则应实现加载方法.

我的意思是,"如果你试图设置类......不要使用初始化." 好的.何时或为什么我会覆盖初始化呢?

objective-c nsobject

112
推荐指数
2
解决办法
4万
查看次数

操作系统X上的Jenkins:xcodebuild会出现代码签名错误

摘要:

使用最新的安装程序(截至2012年3月9日),在OS X上设置Jenkins变得非常容易,但是管理代码签名的过程仍然非常困难,没有简单的答案.

动机:

运行无头CI服务器,该服务器遵循在OS X上运行服务的常见最佳实践(其中一些以简单语言解释).

背景:

处理:

通过OS X 安装程序包安装Jenkins CI .对于"安装类型"步骤,单击"自定义"按钮,然后选择"以启动时启动为'jenkins.'"

讨论:

在这一点上天真的期望是使用构建脚本的自由风格项目xcodebuild -target MyTarget -sdk iphoneos应该工作.正如这篇文章的标题所示,它没有,也没有失败:

Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the …

macos jenkins

107
推荐指数
4
解决办法
5万
查看次数

Objective-C协议前向声明

ObjectProperties.h

@protocol ObjectProperties <NSObject>

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSDate *date;
@property (assign, nonatomic) int64_t index;

@end
Run Code Online (Sandbox Code Playgroud)

ClassA.h

#import <Foundation/Foundation.h>

@protocol ObjectProperties;

@interface ClassA : NSObject <ObjectProperties>

- (void)specialSauce;

@end;
Run Code Online (Sandbox Code Playgroud)

ManagedClassA.h

#import <CoreData/CoreData.h>

@protocol ObjectProperties;

@interface ManagedClassA : NSManagedObject <ObjectProperties>

- (void)doSomething;

@end;
Run Code Online (Sandbox Code Playgroud)

从上面的代码示例中,我在.h文件中定义了一个协议,用于Core Data对象以及普通的'vanilla对象.似乎"噪音"使符合类#import协议在其标题中; 如上所示,在实现文件中转发声明协议和导入会更清晰.但是,当这样做时,Xcode会发出警告:

Cannot find protocol definition for 'ObjectProperties'

代码编译,主要是工作.我之所以说主要是因为Core Data试图动态创建标量属性的getter/setter有一些愚蠢,但我认为这可能是因为我遇到了边缘情况.

当然,最明显的解决方法是将协议头导入类头.

如果我的理解是正确的(我的知识是最近获得的,所以我完全有可能我错了),如果我将协议导入我的类头并对协议进行更改,那么导入我的所有后续文件必须重新编译类.

解决此类问题的正确方法是什么?

protocols objective-c

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

从函数和方法中返回约束泛型

我想创建一个函数,返回符合协议的对象,但协议使用a typealias.鉴于以下玩具示例:

protocol HasAwesomeness {
    typealias ReturnType
    func hasAwesomeness() -> ReturnType
}

extension String: HasAwesomeness {
    func hasAwesomeness() -> String {
        return "Sure Does!"
    }
}

extension Int: HasAwesomeness {
    func hasAwesomeness() -> Bool {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

String并且Int已经扩展为符合HasAwesomeness,并且每个都实现了hasAwesomeness()返回不同类型的方法.

现在我想创建一个返回符合HasAwesomeness协议的对象的类.我不在乎班级是什么,只是我可以发送信息hasAwesomenss().当我尝试以下操作时,我生成了一个编译错误:

class AmazingClass: NSObject {
    func returnsSomethingWithAwesomeness(key: String) -> HasAwesomeness {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:协议'HasAwesomeness'只能用作通用约束,因为它具有Self或相关类型要求

可以想象,目的returnsSomethingWithAwesomeness是返回一个String或者Int基于ok key参数.编译器抛出的错误有点 - sorta是有道理的,为什么它被禁止,但它确实提供了修复语法的洞察力.

func …
Run Code Online (Sandbox Code Playgroud)

generics protocols type-alias swift

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

Mac 10.8上的Eclipse - 安装了1.7.0 JRE/JDK,但Eclipse无法启动

  • 已安装Oracle的Java SE 1.7.0u10及其安装程序包

  • 下载并解压缩的Eclipse Juno(4.2.1)

  • 双击Eclipse purple图标并获取OS X警报提示,并显示错误消息:

要打开"Eclipse",您需要Java SE 6运行时.你想现在安装一个吗?

  • (在终端)which java-/usr/bin/java

  • ls -l /usr/bin/java - /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

  • (在Finder中)双击eclipse别名(在解压缩下载时包含) - 终端启动,/Applications/Eclipse/Eclipse.app/Contents/MacOS/eclipse ; exit ;Exclipse启动时没有OS X警报提示.

我已经尝试修改Eclipse应用程序包plist以将-vm键指向/System/Library/Frameworks/JavaVM.frameworks/Versions/Current/Commands/java,但我觉得我可能不应该这样做. `

我想知道如何通过双击Application包来启动Eclipse.让我烦恼的是一件小事......:o)

java eclipse macos

25
推荐指数
3
解决办法
6万
查看次数

Objective-C Nullability:符合条件的常量字符串

我已经养成了一个很好的习惯,即为NSNotification名字之类的东西声明和使用常量字符串.我声明他们是这样的:

extern NSString * const ABCAwesomeThingHappenedNotification;
Run Code Online (Sandbox Code Playgroud)

随着引进的Xcode 6.3和1.2雨燕的,我要回去,使用新雨燕与互操作和审计Objective-C类nonnull,nullablenull_unspecified预选赛.

将限定符添加到也具有外部可见静态字符串的标头时,我收到以下警告:

警告:指针缺少可为空类型说明符(__nonnull或__nullable)

嗯.那令人困惑/有趣.有人可以解释这条消息背后的原因吗?ABCAwesomeThingHappenedNotification在Swift中使用时,它从不暗示它是可选的String或隐式解包的String.

objective-c swift objective-c-nullability

23
推荐指数
2
解决办法
4010
查看次数

Xcode单元测试 - 仅为设备构建时链接错误

我的应用程序单元在模拟器中运行时测试构建和测试,但在构建和测试设备时失败并出现链接器错误.

在我的应用程序目标上,我设置了以下构建设置:

DEPLOYMENT_POSTPROCESSING = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我设置了以下构建设置:

BUNDLE_LOADER = $(BUILT_PRODUCTS_DIR)/<app name>.app/<app>
TEST_HOST = $(BUNDLE_LOADER)
Run Code Online (Sandbox Code Playgroud)

链接器错误是:

Undefined symbols for architecture armv7s:
"_<An NSString * const>", referenced from:
      -[UnitTestClassA setUp] in UnitTestClassA.o
"_<Another NSString * const>", referenced from:
      -[UnitTestClassB helperMethod:] in UnitTestClassB.o
      -[UnitTestClassB anotherHelperMethod:] in UnitTestClassB.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

...我在Xcode的首选项中打开"继续构建错误后继续",但是我没有收到大量关于NSString*const的链接器错误.如果我做错了什么,那么由于我在整个生产代码中使用字符串常量,因此我会得到比我少数人更多的链接错误.

我正在创建我的字符串常量:

.h文件......

extern NSString * const ReallyGoodString;
Run Code Online (Sandbox Code Playgroud)

.m文件...

NSString * const ReallyGoodString …
Run Code Online (Sandbox Code Playgroud)

xcode unit-testing ios

14
推荐指数
2
解决办法
1999
查看次数

为什么NSOperation示例代码使用@try和@catch

在Apple的并发编程指南中,NSOperation子类示例(非并发和并发变量)使用异常处理,我想知道为什么他们在操作中鼓励这种风格.

清单2-4响应取消请求

- (void)main {
   @try {
      BOOL isDone = NO;

      while (![self isCancelled] && !isDone) {
          // Do some work and set isDone to YES when finished
      }
   }
   @catch(...) {
      // Do not rethrow exceptions.
   }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,通常异常处理不是Objective-C代码中的常见做法 - 异常本质上是程序员错误,应该导致应用程序崩溃,而意外输入最好由NSError处理.(我可能误导理解来自之类的东西这个这个)

我想知道NSOperations是否存在特殊情况,其中异常处理很重要,或者这是否是该指南的特定作者的首选样式.

作为旁注,一些NSOperation示例代码遵循此样式,其他示例则不遵循此样式.大多数高可见性OSS不使用例外(例如AFNetworking).

exception objective-c nsoperation

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

AFNetworking - 为什么它会产生一个网络请求线程?

我试图更好地理解操作和线程,并查看AFNetworking的AFURLConnectionOperation子类,例如,真实世界的源代码.

我目前的理解是当实例NSOperation被添加到操作队列时,队列等管理负责执行操作的线程.在苹果公司的文档,NSOperation它指出,即使子类返回YES-isConcurrent操作将始终在一个单独的线程来启动(为10.6).

基于Apple在线程编程指南并发编程指南中强大的语言,管理线程似乎最好留给内部实现NSOperationQueue.

但是,AFNetworking的AFURLConnectionOperation子类产生了一个新的NSThread,并且操作-main方法的执行被推送到此网络请求线程.为什么?为什么这个网络请求线程是必要的?这是一种防御性编程技术,因为该库旨在供广大受众使用吗?调试库的消费者是不是更麻烦?在专用线程上进行所有网络活动是否有(微妙的)性能优势?

(
1月26日添加)在Dave Dribin 的博客文章中,他演示了如何使用NSURLConnection的具体示例将操作移回主线程.

我的好奇心来自Apple的线程编程指南中的以下部分:

保持你的线程合理繁忙.
如果您决定手动创建和管理线程,请记住线程占用宝贵的系统资源.您应该尽力确保为线程分配的任何任务都是合理的长寿和高效的.与此同时,您不应该害怕终止花费大部分时间闲置的线程.线程使用大量内存,其中一些是有线的,因此释放空闲线程不仅有助于减少应用程序的内存占用,还可以释放更多物理内存供其他系统进程使用.

在我看来,AFNetworking的网络请求线程没有"保持相当忙碌"; 它正在运行一个无限的while循环来处理网络I/O. 但是,请注意,这就是问题的关键 - 我不知道,我只是在猜测.

AFURLConnectionOperation对操作,线程(运行循环?)和/或GCD的具体问题的任何洞察或解构都将非常有利于填补我理解的空白.

objective-c nsoperation nsthread nsoperationqueue afnetworking

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

iOS 7 Tint Color - 当initWithImage时,UINavigationItem的backBarButtonItem不着色:

当我使用 - [UIBarButtonItem initWithImage:style:target:selector:]创建条形按钮项时,我无法在导航项的后栏按钮项上应用色调颜色.

使用图像作为视图控制器背景上下文不再可以吗?我似乎无法在HIG中找到任何迹象,或者其他地方已被弃用或不鼓励.

这是我的代码:

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"camera-navigation_item_back"]
                                                                  style:UIBarButtonItemStyleBordered
                                                                 target:nil
                                                                 action:nil];
[navItem setBackBarButtonItem:barButtonItem];
Run Code Online (Sandbox Code Playgroud)

iOS 7结果:

IOS 7

iOS 6结果:

iOS 6


编辑:如果我尝试使用其中一个系统项目(加号,垃圾桶等)作为我的后退按钮,Apple会将图像替换为标题"返回".这实际上与iOS 6和7中的行为相同.

uikit tintcolor ios7

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