object c中 new和alloc区别

http://blog.csdn.net/newjerryj/article/details/8561717


在object-c基础教程这本书里老是可以看见类似下面这种代码,我这小菜鸟就纳闷了,啥区别啊,看上去都一样么。网上找了找,找到一些说法,这里先摘出来。 

className* object = [className new];

or 

className* object = [[className alloc] init];

背景说明,new是较为老式的写法,后来发现只有一个new不好使,才引入了alloc和init这种写法,保留new一是向后兼容,二是很多时候是一种更简单的写法。

其实是一样的,new在内部调用的alloc和init.

源代码:

 + new{

    id newObject = (*_alloc)((Class)self, 0);

    Class metaClass = self->isa;

    if (class_getVersion(metaClass) > 1) 

        return [newObject init];

    else 

        return newObject;}

+ alloc{

    return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 

}

- init{ 

    return self;

}

[className new]基本等同于[[className alloc] init]. 区别只在于alloc分配内存的时候使用了zone,这个zone是个什么东东呢?它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度.什么要把alloc 和init 分开?1. 可以使用多种init方法2. 显示调用总比隐式调用要好”如果确实不需要用其他的init函数,比如initWithString, 只是使用 [Nsobject alloc] init] ,那用new的方法更加方便 

* new doesn't support custom initializers (like initWithString) * alloc-init is more explicit than new

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来解答你的问题。 首先,需要在项目添加`OpenSSL`库,可以通过`CocoaPods`进行添加,也可以手动添加。 然后,分别实现`AES-GCM`和`AES-ECB`的加密解密操作: ### AES-GCM加密解密 ```objective-c #import <CommonCrypto/CommonCrypto.h> #include <openssl/aes.h> #include <openssl/evp.h> #include <openssl/rand.h> #define kGCMNonceSize 12 // 96 bits #define kGCMTagSize 16 // 128 bits NSData *AESGCMEncrypt(NSData *key, NSData *nonce, NSData *aad, NSData *plainText, NSError **error) { if (nonce.length != kGCMNonceSize) { if (error != NULL) { *error = [NSError errorWithDomain:@"com.example.AESGCMEncrypt" code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Invalid nonce size"}]; } return nil; } unsigned char *keyBytes = (unsigned char *)[key bytes]; unsigned char *nonceBytes = (unsigned char *)[nonce bytes]; unsigned char *aadBytes = (unsigned char *)[aad bytes]; unsigned char *plainTextBytes = (unsigned char *)[plainText bytes]; unsigned char tag[kGCMTagSize]; memset(tag, 0, kGCMTagSize); size_t cipherTextLength = plainText.length + kGCMTagSize; unsigned char *cipherTextBytes = malloc(cipherTextLength); memset(cipherTextBytes, 0, cipherTextLength); unsigned char *cipherTextPtr = cipherTextBytes; size_t cipherTextLen = 0; EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL); EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, (int)nonce.length, NULL); EVP_EncryptInit_ex(ctx, NULL, NULL, keyBytes, nonceBytes); EVP_EncryptUpdate(ctx, NULL, (int *)&cipherTextLen, aadBytes, (int)aad.length); EVP_EncryptUpdate(ctx, cipherTextPtr, (int *)&cipherTextLen, plainTextBytes, (int)plainText.length); EVP_EncryptFinal_ex(ctx, cipherTextPtr+cipherTextLen, (int *)&cipherTextLen); EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, kGCMTagSize, tag); EVP_CIPHER_CTX_free(ctx); NSMutableData *cipherText = [[NSMutableData alloc] initWithBytes:cipherTextBytes length:cipherTextLen+kGCMTagSize]; [cipherText appendBytes:tag length:kGCMTagSize]; free(cipherTextBytes); return cipherText; } NSData *AESGCMDecrypt(NSData *key, NSData *nonce, NSData *aad, NSData *cipherText, NSError **error) { if (nonce.length != kGCMNonceSize) { if (error != NULL) { *error = [NSError errorWithDomain:@"com.example.AESGCMDecrypt" code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Invalid nonce size"}]; } return nil; } unsigned char *keyBytes = (unsigned char *)[key bytes]; unsigned char *nonceBytes = (unsigned char *)[nonce bytes]; unsigned char *aadBytes = (unsigned char *)[aad bytes]; unsigned char *cipherTextBytes = (unsigned char *)[cipherText bytes]; unsigned char tag[kGCMTagSize]; memcpy(tag, cipherTextBytes+cipherText.length-kGCMTagSize, kGCMTagSize); size_t plainTextLength = cipherText.length - kGCMTagSize; unsigned char *plainTextBytes = malloc(plainTextLength); memset(plainTextBytes, 0, plainTextLength); unsigned char *plainTextPtr = plainTextBytes; size_t plainTextLen = 0; EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL); EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, (int)nonce.length, NULL); EVP_DecryptInit_ex(ctx, NULL, NULL, keyBytes, nonceBytes); EVP_DecryptUpdate(ctx, NULL, (int *)&plainTextLen, aadBytes, (int)aad.length); EVP_DecryptUpdate(ctx, plainTextPtr, (int *)&plainTextLen, cipherTextBytes, (int)plainTextLength); EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, kGCMTagSize, tag); int ret = EVP_DecryptFinal_ex(ctx, plainTextPtr+plainTextLen, (int *)&plainTextLen); EVP_CIPHER_CTX_free(ctx); if (ret <= 0) { if (error != NULL) { *error = [NSError errorWithDomain:@"com.example.AESGCMDecrypt" code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Decryption failed"}]; } return nil; } NSData *plainText = [[NSData alloc] initWithBytes:plainTextBytes length:plainTextLen]; free(plainTextBytes); return plainText; } ``` 使用示例: ```objective-c NSData *key = [NSData dataWithBytes:"01234567890123456789012345678901" length:32]; NSData *nonce = [NSData dataWithBytes:"012345678901" length:12]; NSData *aad = [@"additional authenticated data" dataUsingEncoding:NSUTF8StringEncoding]; NSData *plainText = [@"plain text" dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; NSData *cipherText = AESGCMEncrypt(key, nonce, aad, plainText, &error); if (cipherText != nil) { NSData *decryptedPlainText = AESGCMDecrypt(key, nonce, aad, cipherText, &error); NSLog(@"Decrypted plain text: %@", [[NSString alloc] initWithData:decryptedPlainText encoding:NSUTF8StringEncoding]); } else { NSLog(@"Encryption failed: %@", error.localizedDescription); } ``` ### AES-ECB加密解密 ```objective-c NSData *AESECBEncrypt(NSData *key, NSData *plainText) { unsigned char *keyBytes = (unsigned char *)[key bytes]; unsigned char *plainTextBytes = (unsigned char *)[plainText bytes]; size_t cipherTextLength = plainText.length + AES_BLOCK_SIZE; unsigned char *cipherTextBytes = malloc(cipherTextLength); memset(cipherTextBytes, 0, cipherTextLength); unsigned char *cipherTextPtr = cipherTextBytes; size_t cipherTextLen = 0; AES_KEY aesKey; AES_set_encrypt_key(keyBytes, (int)(key.length*8), &aesKey); AES_encrypt(plainTextBytes, cipherTextPtr, &aesKey); NSData *cipherText = [[NSData alloc] initWithBytes:cipherTextBytes length:cipherTextLen+AES_BLOCK_SIZE]; free(cipherTextBytes); return cipherText; } NSData *AESECBDecrypt(NSData *key, NSData *cipherText) { unsigned char *keyBytes = (unsigned char *)[key bytes]; unsigned char *cipherTextBytes = (unsigned char *)[cipherText bytes]; size_t plainTextLength = cipherText.length; unsigned char *plainTextBytes = malloc(plainTextLength); memset(plainTextBytes, 0, plainTextLength); unsigned char *plainTextPtr = plainTextBytes; size_t plainTextLen = 0; AES_KEY aesKey; AES_set_decrypt_key(keyBytes, (int)(key.length*8), &aesKey); AES_decrypt(cipherTextBytes, plainTextPtr, &aesKey); NSData *plainText = [[NSData alloc] initWithBytes:plainTextBytes length:plainTextLen]; free(plainTextBytes); return plainText; } ``` 使用示例: ```objective-c NSData *key = [NSData dataWithBytes:"01234567890123456789012345678901" length:32]; NSData *plainText = [@"plain text" dataUsingEncoding:NSUTF8StringEncoding]; NSData *cipherText = AESECBEncrypt(key, plainText); NSData *decryptedPlainText = AESECBDecrypt(key, cipherText); NSLog(@"Decrypted plain text: %@", [[NSString alloc] initWithData:decryptedPlainText encoding:NSUTF8StringEncoding]); ``` 注意:`AES-ECB`加密模式不安全,不建议使用。建议使用`AES-GCM`等更加安全的加密模式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值