Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

先看下面一个例子

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

@interface Something : NSObject

- (void)doWithError:(NSError **)outError;

@end

@implementation Something

- (void)doWithError:(NSError **)outError
{
    @autoreleasepool
    {
        *outError = [NSError errorWithDomain:@"Emergency" code:999 userInfo:nil];
    }
}

@end

int main(int argc, const char *argv[])
{
    @autoreleasepool
    {
        NSError *error = nil;
     // Sometimes EXC_BAD_ACCESS when return from this method.
        [[[Something alloc] init] doWithError:&error];

        // At this point, the main thread gives EXC_BAD_ACCESS.
        NSLog(@"%@", error);
    }
    return 0;
}

在NSLog输出的时候会EXC_Bad_ACCESS

正确写法应该是这样:

@interface Something : NSObject

- (void)doWithError:(NSError **)outError;

@end

@implementation Something

- (void)doWithError:(NSError **)outError
{
    NSError *error = nil;
    @autoreleasepool
    {
        error = [NSError errorWithDomain:@"Emergency" code:999 userInfo:nil];
        // Do something
    }
    if(error)
    {
        *outError = error;
    }
}

@end

int main(int argc, char * argv[])
{
    @autoreleasepool
    {
        NSError *__autoreleasing error = nil;

        [[[Something alloc] init] doWithError:&error];

        // At this point, the main thread gives EXC_BAD_ACCESS.
        NSLog(@"%@", error);

        int a = 1;
        ++a;
    }
    return 0;
}

Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

时间: 2024-10-07 02:03:26

Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案的相关文章

struts2在struts.xml中为返回的页面配参数时出现Invalid result location value/parameter

在学ognl表达式时,在struts.xml中为返回的页面配参数时,出现Invalid result location value/parameter,但参数可以传过去,原因是:MyEclipse肯定在普通验证xml方法之外加了Struts的特殊检验规则,解决办法: 去掉build较检,保留手动较检,这样当实在是需要MyEclipse提供的Struts2较检的时候手动较检一下.

指针用作传出参数时,需要二级指针

1. 参数传递的原则是:形参传给实参,不能反向传递: 2. 一级指针可以在函数内部修改形参指针指向的内容; 如: void fun(char *p) { p[2] = a;//由形参(实参)指向的函数外部的数组的内容就被改变了. } 如果我们想改变实参本身呢?也就是说,我们连指针值都要改变,如果使用: void GetMemory(int num, char *p) { p = (char *)malloc(num * sizeof(char)) //或C++中:p = new char[10]

实参和形参指针做函数参数时,如何改变main函数变量的值

//对输入的两个整数按大小顺序输出 代码如下: #include<iostream> using namespace std; int main() { void swap(int *p1,int *p2); int *pointer_1,*pointer_2,a,b; cin>>a>>b; pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); cout<<"

关于二维数据中的一维指针作为函数参数和返回值

问题描述: 1 假定定义了一个二维数组用来存放多条(总20条)数据,每条数据长度为10,uchar message[20][10] 2 要将外部来的一条数据存放到缓冲区指定位置(入口参数 uchar *p,数据的开始地址) 3 要从缓冲区读出一条记录,将其输出(出口参数 uchar *p,数据的开始地址). 那么该怎么写2个函数的形参/return值/返回值类型 答案: void sendbuf(uchar a[10]) { ...将a[0]~a[9]的值拷贝到指定缓冲区buf[i][0~9]

C#WebApi中swagger在线文档输出参数和输入参数显示注释

最近开发webapi 时需要生成在线文档,发现文档里面没注释,在网上查找资料都不齐全,或者看起来很难看懂. 花了点时间搞出来了这个,很多都是借鉴网上资料整理的,通俗易懂小白专用. 最终效果如上图所示 1.定义一个SwaggerControllerDescProvider实现ISwaggerProvider接口 using Swashbuckle.Swagger; using System; using System.Collections.Concurrent; using System.Col

C提高 3 字符串与二维指针

二维指针三种内存模型图: 统计字符串两头,非空字符的长度 #include <stdio.h>  #include <stdlib.h> #include <string.h> int main() { //统计字符串两头,非空字符的长度 char *p = "  abc   "; int i = 0; int j = strlen(p) - 1; int count = 0; while (isspace(p[i]) && p[i]

C++二维数组(指针)做参数

一.问题描述 使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃.下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍. 1.二维数组的定义与初始化 在实际使用数组的时候往往开始不知道二维数组的行数和列数,因此程序需要根据用户输入动态定义二维数组的行和列.这里通过C++二级指针来实现,引入变量 int rowNum 行 数, int coluNum 列数, char **p 二维字符数组,这里假定二维字符数组中的字符只能为'0'和'1'. int

C++ 二维数组(双重指针作为函数参数)

本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong99/article/details/6723163 1.使用二维数组作为形参的例子: void func(int arr[][10]) { } int main() { int array[10][10]; func(array); //用二维数组名作为实参,调用函数 } 上面的例子可以编译通过,

通过操作指针,与指针做函数参数&#39;实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 因为p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据