我有兴趣了解导致开发人员覆盖+初始化或+加载的情况.文档清楚地表明Objective-C运行时为您调用了这些方法,但这些方法的文档中确实清楚了.:-)
我的好奇心来自于Apple的示例代码 - MVCNetworking.他们的模型类有一个+(void) applicationStartup
方法.它在文件系统上做一些内务处理,读取NSDefaults等等......并且,在尝试了解NSObject的类方法之后,似乎这个清洁工作可能可以放入+ load.
我确实修改了MVCNetworking项目,将App Delegate中的调用删除到+ applicationStartup,并将管家位置放入+ load ...我的计算机没有着火,但这并不意味着它是正确的!我希望能够理解你需要调用的自定义设置方法与+ load或+ initialize之间的任何细微之处,陷阱和其他内容.
对于+ load文档说:
加载消息将发送到动态加载和静态链接的类和类别,但前提是新加载的类或类别实现了可以响应的方法.
如果你不知道所有单词的确切含义,那么这句话很难解析.救命!
什么是"动态加载和静态链接?" 某些东西可以动态加载和静态链接,还是它们是互斥的?
"......新加载的类或类实现了一个可以响应的方法"什么方法?回应怎么样?
至于+ initialize,文档说:
初始化它每个类只调用一次.如果要对类和类的类别执行独立初始化,则应实现加载方法.
我的意思是,"如果你试图设置类......不要使用初始化." 好的.何时或为什么我会覆盖初始化呢?
这就是我想要做的事情:
NSRange r = NSMakeRange(0,5);
id a = [NSMutableArray a];
[a addObject: r]; // but NSRange is not a NSObject *
Run Code Online (Sandbox Code Playgroud)
使用布尔值,我会使用这样的代码:
[a addObject: [NSNumber numberWithBool: YES]];
Run Code Online (Sandbox Code Playgroud)
或者用整数:
[a addObject: [NSNumber numberWithInteger: 3]];
Run Code Online (Sandbox Code Playgroud)
那么什么是等同于NSRange
?我真的不想做的是创建我自己的子类NSObject
来完成这个.当然苹果已经提供了一种方式吗?
这是一个示例类的布局,有人可以指导我在创建NSObject的子类时的最佳实践吗?
class MyClass: NSObject {
var someProperty: NSString! = nil
override init() {
self.someProperty = "John"
super.init()
}
init(fromString string: NSString) {
self.someProperty = string
super.init()
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的,我在这里遵循最佳做法吗?
我想知道我是否正确设置了初始化器(一个将字符串设置为默认值,一个我可以传入一个字符串)?
我应该super.init()
在每个初始化器的末尾调用吗?
我的更具体(带字符串的那个)初始化器是否应该self.init()
在最后调用而不是super.init()
?
在子类化时,在Swift中设置初始值设定项的正确方法是什么NSObject
? - 我该如何调用super init?
这个问题(尽管在目标C中)建议你应该有一个init,你总是调用它,只需在更具体的内容中设置属性:Objective-C Multiple Initialisers
什么是__NSArrayI和__NSArrayM?
__NSArrayI(或M)导致"无法识别的选择器"错误.
如何转换为NSArray?
我做了测试解析json,twitter api.
http://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name=twitterapi
==>工作正常.解析对象是NSCFDictionary类.(这个字典包含__NSArrayM类)
http://api.twitter.com/1/statuses/user_timeline.json?&screen_name=twitterapi
==>错误.解析对象是__NSArrayM类.
我已经看到为了调试目的而提及描述和debugDescription,但是我们已经看到了何时使用哪些以及在什么条件下它们可能产生不同结果的精确解释.
NSObject的文档在debugDescription上也没有任何内容.问题:何时使用哪种,在什么条件下,它们的输出应该/会不同?
我有一个数据库模型类NSObject
.我有一组这些对象NSMutableArray
.我用indexOfObject:
来找比赛.问题是模型对象的内存地址更改.所以我重写了hash
返回模型行ID的方法.然而,这并没有解决它.我还必须覆盖isEqual:
方法来比较方法的值hash
.
isEqual:
默认情况下,该方法用于确定相等性的是什么?
我假设它使用内存地址.阅读isEqual:
文档后,我认为它使用了hash
方法中的值.显然,事实并非如此,因为我试图覆盖这个价值并没有解决我最初的问题.
我见过代码如下:
if (delegate != nil && [delegate respondsToSelector:@selector(doSomething)]) ...
Run Code Online (Sandbox Code Playgroud)
但是,发送消息nil
只返回nil
(评估为NO
),所以为什么不这样做:
if ([delegate respondsToSelector:@selector(doSomething)]) ...
Run Code Online (Sandbox Code Playgroud)
如果前者更快delegate == nil
吗?无论哪种方式,我更喜欢后者,因为它的代码更少.
并且,less
比more
.每个Unix专业人员都知道.
Objective-C中NSObject的目的/用途是什么?我看到扩展NSObject的类是这样的:
@interface Fraction : NSObject
Run Code Online (Sandbox Code Playgroud)
在C++或Java中,我们不使用任何变量,如NSObject,即使我们在Objective-C和Java中都有预处理程序指令和import语句.
为什么类在Objective-C中明确地继承了NSObject?不从NSObject声明继承有什么后果?
我正在检查是否已选择元素.
func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
{
// First, see if the game is in a paused state
if !gamePaused
{
// Declare the touched symbol and its location on the screen
let touch = touches.anyObject! as? UITouch
let location = touch.locationInNode(symbolsLayer)
Run Code Online (Sandbox Code Playgroud)
这个以前在Xcode 6.2中编译得很好但是有了6.3更新,"let touch = touches.anyObject!as?UITouch"这一行引发了错误:
'Set'没有名为'anyObject'的成员
我已经阅读了许多类似的问题,但我似乎无法理解"要使用价值,你需要首先解开".特别是因为答案似乎集中在通知上.
非常感谢.w ^
NSObject协议附带了库存协议模板,但它似乎并不是实际协议实现所必需的.离开它似乎完全没有改变.那么,协议是否真的有必要从中继承,还是仅仅是一个不必要的附加组件?
nsobject ×10
objective-c ×7
ios ×4
iphone ×2
nsarray ×2
swift ×2
cocoa ×1
cocoa-touch ×1
inheritance ×1
nsrange ×1
null ×1
set ×1
subclass ×1
xcode ×1