我想调用一个超类的超类方法,而不会破坏继承链.像这样的东西:
+(id) alloc
{
return [super.super alloc];
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
不要混淆这里superclass讨论的方法提供的行为.
UPD:
几句话super和superclass差异.
让我们说,我们有AClass和SuperAClass.从他们的名字AClass继承如下SuperAClass.他们每个人都有一个方法的实现-(void) foo;
AClass实现的一个下列类别方法:
超类:
+(id) alloc {
return [[self superclass] alloc];
}
Run Code Online (Sandbox Code Playgroud)
超级:
+(id) alloc {
return [super alloc];
}
Run Code Online (Sandbox Code Playgroud)
现在,假设这两行代码:
AClass *AClassInstance = [AClass alloc];
[AClassInstance foo];
Run Code Online (Sandbox Code Playgroud)
在第一种情况下(使用超类),SuperAClass的foo方法将被调用.用于(使用超)第二种情况下,AClass的foo方法将被调用.
我的想法是我有一个应该为不同客户定制的应用程序模板.主要目标是提供具有几乎相同功能的多个个性化应用程序.
Xcode项目组织(也许是管理层)的最佳方法是什么,以便为每个客户的应用程序实现以下几点:
目前,对于每个个性化请求,我在同一项目的根目录中创建新项目文件,以及相应的XIB文件,图像集和源文件(对于某些功能请求)目录.每个项目文件都有对主源文件目录(引擎)的引用.
但我认为这不是组织此类项目的最佳方式.
有没有办法以某种方式模拟一个类的类别行为关于它的实例变量,而不是方法?
我有一个ClassA,我希望在用新方法和其他cllass(ClassB)的ivars扩展它之后保留它的名字.当然,我可以继承ClassA,但结果类会有不同的名称.
对于方法添加,这不是问题 - 类别将是一个很好的解决方案.
UPDATE: ClassA用作XIB的文件所有者,这些要扩展的字段是IBOutlets.所以我在构建阶段需要它们.
正如我所理解的那样,除了Objective-C语言是"干净"C的严格超集之外,添加的OOP范例是通过Objective-C Runtime Reference中部分描述的一组函数来模拟的.
因此,我希望有可能以某种方式在中间C/C++文件中编译Objective-C代码(可能有一些asm插入).
一般可能吗?
我想使用类NSArray + Populate.h扩展一个类:
@interface NSArray (Populate)
-(NSArray *) populateArray;
@end
Run Code Online (Sandbox Code Playgroud)
如果有另一个类别(来自另一个模块或库),使用具有相同名称的方法扩展NSArray,如何检测情况?
例如,如果有NSArray + Fill.h:
@interface NSArray (Fill)
-(NSArray *) populateArray;
@end
Run Code Online (Sandbox Code Playgroud)
据我了解,运行时引擎会默默地选择其中一个版本,而不会发生任何崩溃?
在自动合成后,getter和setter方法的主体是什么样的?
从官方文档到目前为止我发现只推荐了实现技术,但是没有关于编译器在合成过程中使用哪些文件的说法:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/ mmAccessorMethods.html#// apple_ref/DOC/UID/TP40003539-SW5
一些技术推荐包含autorelease消息的实现,这对于多线程编程来说并不十分安全.我只是想知道自动生成的代码是否跟随一些提议的实现.
例如:
.H
@interface AClass: NSObject{}
@property (nonatomic, retain) AnotherClass *aProp;
@end
Run Code Online (Sandbox Code Playgroud)
.M
@implementation AClass
@synthesize aProp
-(id) init {
if ((self = [super init])) {
self.aProp = [[AnotherClass alloc] init]; // setter invocation
}
return self;
}
-(AnotherClass *) aMethod {
return self.aProp; // getter invocation
}
@end
Run Code Online (Sandbox Code Playgroud)
什么是aProp编译器生成的等效访问者代码片段?
-(AnotherClass *) aProp {
// getter body
}
-(void) setAProp: (AnotherClass *) {
// setter body
}
Run Code Online (Sandbox Code Playgroud) objective-c ×7
ios ×5
iphone ×3
cocoa ×2
cocoa-touch ×2
c ×1
c++ ×1
gcc ×1
runtime ×1
xcode ×1