Objective-C中如何创建构造函数呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Objective-C中如何创建构造函数呢?相关的知识,希望对你有一定的参考价值。
各位大大,我想知道Objective-C中如何创建构造函数,有没有相关资料啊?!
在objective-c中与使用很多其他的oop语言一样,可以使用构造函数,他是在创建对象的时候用来初始化对象数据的一种特殊的方法。构造函数可以使用任何方式命名,但是通常,将他们命名为Init。构造方法返回对象的一个指针,可以通过调用超类的init方法来获取这个指针(超类是当前的类所派生自的类,也就是当前类的父类,这里通常是NSObject类);
参考代码:
#import <Foundation/Foundation.h>
#import "student.h"
@interface myobj:NSObject
int number;
-(void) setNumber:(int)Num:(int) Num2;
-(void) outP;
-(myobj*) myinit:(int)Num:(int)Num2;
@end
@implementation myobj
-(myobj*) myinit:(int)Num:(int)Num2
self =[super init];// 这里的超类的Init方法的名称是不能改变的
if (self)
[self setNumber:Num:Num2];
return self;
-(void) setNumber:(int)Num:(int)Num2
number = Num+Num2;
-(void) outP
printf("this is the number you put in =%i",number);
@end
int main (int argc, const char * argv[])
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
myobj* obj = [[myobj new] myinit:10:20];
[obj outP];
[pool drain];
return 0;
参考技术A 那个,这个里面没有构造函数,只有初始化函数以initwithXXXX:(类型) 变量 and:参数个数不限
使用 JavascriptCore 创建构造函数
【中文标题】使用 JavascriptCore 创建构造函数【英文标题】:Creating Constructors with JavascriptCore 【发布时间】:2013-11-21 06:14:39 【问题描述】:使用JavascriptCore API
时,我不确定如何通过new
语法(ex. var x = new MyAwesomeClass())
从Javascript 创建新的Objective-C 对象实例。似乎在传递符合JSExport-derived protocol
的 Objective-C 类时在 Javascript 中创建的构造函数对象应该可以作为构造函数调用,但它们不是。
例如,假设我删除了一个符合 JSExport-derived protocol
的类,并将其插入到 javascript 上下文中:
@protocol MyAwesomeClassExports <JSExport>
...
@end
@interface MyAwesomeClass : NSObject <MyAwesomeClassExports>
...
@end
JSContext *context = ...;
context[@"MyAwesomeClass"] = [MyAwesomeClass class]
然后,如果我尝试通过这样的语法在 javascript 中创建一个新实例:
[object MyAwesomeClassConstructor] is not a constructor
是否可以使用new
语法从javascript 中创建新的Objective-C 对象实例?理想情况下,我希望它是 alloc
,然后在我的 Objective-C 实例上调用 init
方法。如果在 javascript 中传递了任何参数,那么这些参数有望在 Objective-C init
方法中通过 [JSContext currentArguments] 类方法访问。
【问题讨论】:
【参考方案1】:这是我一直在使用的。希望这会有所帮助!
extern void RHJSContextMakeClassAvailable(JSContext *context, Class class)
NSString *className = NSStringFromClass(class);
context[[NSString stringWithFormat:@"__%@", className]] = (id) ^(void) return [[class alloc] init]; ;
[context evaluateScript:[NSString stringWithFormat:@"var %@ = function () return __%@();;", className, className]];
//allow a class to perform other setup upon being loaded into a context.
SEL selector = NSSelectorFromString(@"classWasMadeAvailableInContext:");
if ([class respondsToSelector:selector])
((void (*)(id, SEL, JSContext*))[class methodForSelector:selector])(class, selector, context);
【讨论】:
使用这个时,类方法可以被访问,因为构造函数没有包含正确的原型。这会导致类方法不可访问。该代码确实适用于构造函数的创建。【参考方案2】:一个简单的解决方案是在 Obj-C 中定义一个构造函数。
// Inside protocol
+ (MyAwesomeClass *)create;
...
// Inside implementation
+ (MyAwesomeClass *)create
return [[MyAwesomeClass alloc] init];
然后在 JavaScript 中,只需调用这个构造函数来创建一个新对象:
obj = MyAwesomeClass.create()
【讨论】:
这帮助了我。很好的答案。【参考方案3】:我知道这真的很老了,但这对我有用:
context[@"MyClass"] = ^MyClass*
return [[MyClass alloc] init];
;
然后来自 JavaScript:
var myClass = new MyClass();
【讨论】:
【参考方案4】:为要从 Javascript 实例化的类创建一个协议。它应该扩展 JSExport。
@import JavaScriptCore
@protocol EntityExports <JSExport>
@property NSString *somePropertyToExpose
- (instancetype)initWithSomeValue:(NSString *)value;
@end
@interface Enity : NSObject <EntityExports>
@end
并在 .m 文件中,实现初始化器并合成属性:
@implementation Entity
@synthesize somePropertyToExpose = _somePropertyToExpose;
- (instancetype)initWithSomeValue:(NSString *)value
// implementation goes here
@end
然后,在您实例化 JSContext 的代码中:
context[@"Entity"] = [Entity class];
并在 Javascript 中实例化 Entity
:
var entity = new Entity("hello!");
(请注意,该属性不是构造对象所必需的;它只是为了使示例变得不平凡)。
【讨论】:
值得注意的是,JSExported 类中只能有一个初始化器,多个初始化器被丢弃(见上面的补丁)。【参考方案5】:前几天在 Apple 开发者论坛here 上提出了这个问题。
据我所知,这似乎是最近才在 WebKit(包括 JavaScriptCore)中修复的已知缺陷;并且更改不在 iOS7 中:
https://bugs.webkit.org/show_bug.cgi?id=123380
是否可以通过使用 JSObjectMake 和正确配置的 JSClassDefinition 在 WebKit 外部完成此操作?我没有时间调查这条路线。
【讨论】:
【参考方案6】:我不确定这一点,但我认为你应该先创建你的 Objective-C 对象,然后你应该像这样创建 JSValue:
MyAwesomeClass *myClass = [[MyAwesomeClass alloc] init];
JSValue *dataValue = [JSValue valueWithObject: myClass inContext:context];
让我知道这是否有帮助。
【讨论】:
以上是关于Objective-C中如何创建构造函数呢?的主要内容,如果未能解决你的问题,请参考以下文章