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中如何创建构造函数呢?的主要内容,如果未能解决你的问题,请参考以下文章

什么是构造函数呢?构造函数又有什么作用呢?

Objective-C类的构造函数和析构函数

Objective-C 中的构造函数

Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?

Kotlin二级构造函数

swift中构造方法和Kvc