class method and my array
我有这个代码:
h
1 2 3 4 5
| @interface DetalhesPod : UIViewController {
NSString *linhaPod;
}
@property (nonatomic, strong) NSString *linhaPod; |
m
1 2 3
| + (NSArray *)_tracks {
NSArray *arrTexto = [self.linhaPod componentsSeparatedByString:@"#"];
} |
为什么我对"self.linhapod"中的"+"有问题?如果我加"—"我就没问题了:
1 2
| - (NSArray *)_tracks {
} |
错误信息:实例变量"linhapod"在类方法中访问…
谢谢
- 不是Xcode问题。——现在想想。从类方法内部调用self上的实例方法是没有意义的。类方法如何知道要对哪个特定对象(实例)调用实例方法?
- 那么如何访问类"tracks"中的变量"linhapod"?可能还是不可能?
- @不,你不能。
您在这里看到的是类和该类的实例之间的区别。类的每个实例都有自己的linhaPod实例变量-在一个实例中,它可能指向字符串@"bob",而在另一个实例中,它可能是@"andy"。类是它自己的实体。类方法中的self指的是类本身,而不是任何实例。那么从类本身访问这个变量意味着什么呢?实例变量只存在于实例中(因此称为实例变量)。
不能从静态方法或类方法引用属性(在本例中,是_tracks)。这是因为类方法不在对象上操作,如果没有对象,对象属性值的概念就没有意义。类方法只能使用同一类中的其他类方法和静态变量。查看维基百科关于静态方法的文章(这个概念对于许多编程语言都很常见,包括Objective-C)。它是编程中的一个基本概念,值得学习。
- 对,除了目标C类方法和其他语言中的静态方法不同。C函数是静态方法的客观C等价物。
- @Jlehr你能再解释一下吗?例如,Objc类方法和Java静态方法之间的区别是什么?我专门讨论静态成员函数,顺便说一句。
- Objective-C中的类方法使用与实例方法完全相同的机制进行调度——换句话说,它们是动态查找的,因此它们不是静态的。因此,它们继承方式与实例方法相同,并且可以在子类中重写。注意,在ObjtoE-C类方法中,EDCOX1、0和EDCOX1(1)是可见的,而Java中的静态方法则不是这样。
- @jlehr:我不认为objc静态方法中可以看到super。self是可见的,但它是类对象。所以在实例方法中,它与self有很大的不同。
- @黑骑士:super关键字与self等价,但在超类而不是当前类中启动方法查找。它可以在任何方法中工作,包括类方法。(为什么不呢?类和实例方法之间没有真正的区别,只是一个方法在类上,另一个方法在类的实例上。)
- 当我试图在类方法中引用super时,会得到一个"未声明的标识符"错误。
- @黑骑士:你用它来接收信息吗?因为这是关键字唯一有效的上下文。
- @查克:我试着做《江户记》1〔8〕。我想这和叫[super description]是一样的。
- @黑骑士:不,那是无效的。它也不能在实例方法中工作。super不是标识符,而是关键字。它必须出现在消息发送的接收位置(即[super something])。如果你做了NSLog(@"super: %@", [super description]),那就行了。
- @查克:太棒了。[super description]确实有效。你每天都在学习!
- 在其他OO语言(如C++和Java)中,"静态"不是"静态"的意思。您混淆了static关键字的两个含义。
- @H2CO3我哪里出错了?下面是静态方法上的维基百科:"在静态类型语言如Java中,静态方法称为"static",因为它们是基于它们被调用的类静态地解决的(即编译时),而不是动态的,如在实例方法的情况下,基于对象的运行时类型来解决多态性。因此,静态方法不能被重写。"来源:en.wikipedia.org/wiki/…
- @Jlehr"静态"的意思几乎也是巧合(尽管我能看到两者之间的关系)。这里的主要问题是是否在类的实例或类本身上调用方法。这与一个方法是多态性无关(然而,你是对的,在客观C类方法是多态性的,但这不是OP要求的)。
- @h2co3-heh,"几乎是个巧合"…词组转换得很好。;-)同样,我最初的评论是,一个Objective-C类方法与其他语言中的静态方法不同。我不确定你的建议是否是错误的,或者你认为我的后续解释不充分,但无论如何,这是一个切点。
- @Jlehr不,这是正确的,因为客观C类方法是多态的。我想说的是,这不是他们与众不同的原因。但是的,这可能被过度讨论了:p