OC中的构造函数

在OC中的构造函数和C++中有很大相似之处,但是也有不同,下面我们就来看看在OC中构造函数的,声明,定义和调用。

在这个地方我们通过一个例子来说明:

我们在OC中创建一个Person类:

Person.h:

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *pname;
@property int age;
@property NSString *address;

//声明构造函数,可以看到的是:构造函数有实例构造函数,和类构造函数,当然实例构造函数顾名思义就是通过创建实例类初始化对象,类构造函数是直接又类名调用。那么两者的定义有怎样的区别:,首先是知道的构造函数的返回值都是一个实例,(instancetype),实例构造函数最前面是一个 ‘-’然而类构造函数的最前面是''+",而且实例构造函数在最开始的字符都是initWith

而且With的W是必须大写的,这个是有参数的实例化对象的。

-(instancetype)initWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address;
+(instancetype)personWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address;
@end
//构造函数的定义:

#import "Person.h"
@implementation Person
-(instancetype)initWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address
{

  if([super init])//对父类进行初始化
  {
      self.pname=pname;//调用set函数给对象进行赋值
      self.age=age;
      self.address=address;
  }
    return self;//最后的返回值是一个对象的本身。
}
+(instancetype)personWithPname:(NSString *)pname age:(int)age andAddress:(NSString *)address
{//这个是类的构造方法,在这个构造方法其实是首先为对象分配内存,然后调用方面的方法为成员变量进行赋值
    return [[self alloc] initWithPname:pname age:age andAddress:address];
}

//最后是方法的调用:

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //Person *per = [Person new];这个地方实例化一个对象,并且调用的是默认的构造函数
        //Person *per = [[Person alloc] init];//这个地方的实际上也是调用默认的构造函数,上面的new其实不仅仅有分配内存空间的作用,而且还能初始化对象,所谓的初始化对象是给成员变量进行赋值,但是我们并不知到赋的是什么值,可以这样理解,创建对象的时候,对象就像没有被修理的土地一样,杂草丛生,但是当我们实例化对象就不同了,我们像给对土地清理干净了。
        //Person *per = [[Person alloc] initWithPname:@"帅的不要不要的" age:18 andAddress:@"苏州"];

//这个是我们利用自己定义的构造函数来实例化对象,而且要知道的是我们利用自己创建构造函数来实例化对象的时候,是需要为首先是分配内存空间然后调用构造函数

       Person *per = [Person personWithPname:@"帅的不要不要的" age:18 andAddress:@"苏州"];
//而且还要知道的是这个地方是通过类名来调用构造函数。      

NSLog(@"%@",per);
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Frida是一款针对移动应用的动态分析工具,它可以对APP进行hook和脱壳等操作。Frida在调用OC函数时,需要使用Objective-C Runtime的方法进行调用。 首先,Frida需要与应用进行通信,以便能够在运行时hook应用的方法和函数。Frida提供了多种方式与应用进行通信,其较为常用的是通过Frida提供的JavaScript API来实现。在JavaScript,可以使用frida的API来遍历当前运行的进程,找到目标进程,并获取到其Objective-C运行时。 接下来,就可以使用Objective-C Runtime提供的方法,比如`class_addMethod`或`method_exchangeImplementations`来hook目标类或方法,从而达到调用OC函数的目的。需要注意的是,在hook之前,必须先对目标类或方法进行类定义或方法定义,以便后续在hook调用。此外,还需要考虑hook时所使用的参数和返回值类型,必须与被hook的函数或方法保持一致,否则可能会导致异常。 在Frida,调用OC函数的过程需要注意一些细节和注意事项,但总体来说,通过Objective-C Runtime的方式,可以实现在运行时hook和调用OC函数的目的。 ### 回答2: Frida是一款逆向工程工具,可以用来调用Objective-C函数。Objective-C是一种面向对象的编程语言,是苹果公司开发和推广的语言。Frida支持通过绕开iOS的应用程序级加密,直接访问内存,可以在iOS设备上实现针对Objective-C的Hook。 在使用Frida调用Objective-C函数时,需要先安装Frida到设备上并连接上Frida服务。接着,需要在Frida编写脚本代码,来调用Objective-C函数。 在Frida,可以使用以下函数来执行Objective-C方法: 1. ObjC.classes:获取所有Objective-C类。 2. ObjC.choose():获取匹配模式的某个实例。 3. ObjC.classes['类名称'].方法名.implementation(参数):调用Objective-C类的方法。 例如,在Frida调用方法名为“test”且参数为“hello”的Objective-C函数,代码如下: ```javascript var className = ObjC.classes['Test']; var methodName = "test"; var parameter = "hello"; var hook = eval('var temp = '+ className +'; '+ '(function() {return temp["'+ methodName +'"]})()'); Interceptor.attach(hook.implementation, { onEnter: function (args) { console.log("[*] Starting Test"); console.log("[+] Parameters: " + Memory.readUtf8String(args[2])); }, onLeave: function (retval) { console.log("[*] Completed Test"); } }); ``` 其,ObjC.classes获取Objective-C类,eval函数获取某个类的方法,Interceptor.attach则是在某个函数被调用前后注入进程。 总之,使用Frida调用Objective-C函数需要先了解Objective-C类和方法的概念,并在Frida编写相应的脚本进行调用。 ### 回答3: Frida是一款用于Windows、macOS、Linux、iOS和Android平台的动态分析工具,可在运行时修改应用程序的行为和拦截网络通信。在iOS平台上,Frida可以利用Objective-C的运行时库注入自己的代码,从而调用Objective-C代码。 要在Frida调用OC函数,需要先获取要调用的函数的地址。可以使用以下命令在Frida控制台获取函数地址: ``` var className = "ViewController"; // 要调用的函数所在的类名 var funcName = "-(void)showAlert:(NSString *)message"; // 要调用的函数名 var ptr = ObjC.classes[className][funcName].implementation; console.log("Function Address: " + ptr); ``` 在获取到函数地址后,可以使用以下命令在Frida控制台调用OC函数: ``` var funcPtr = new NativePointer("0x12345678"); // 0x12345678为要调用的函数地址 var showAlertFunc = new NativeFunction(funcPtr, 'void', ['pointer']); showAlertFunc(Memory.allocUtf8String("Hello, Frida!")); ``` 其,'void'是函数返回类型,['pointer']是参数类型的数组。在这个例子函数只有一个NSString类型的参数,因此参数类型为['pointer'],并需要使用Memory.allocUtf8String()函数将字符串转换为指针类型。 使用Frida调用OC函数需要一定的Objective-C和JavaScript基础,对iOS平台下的应用开发有一定的了解,同时也要注意避免对应用程序造成不良影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值