IOS开发学习,Recipe类定义后,在NSArray中使用就报错,但调试不进去
问题详情见图片中的注释,谢谢高手后来发现是另外一个地方导致的。问题来了:用XCode调试吧,一旦代码出错,既不返回错误信息,也不定位到错误行,只是黑屏、黑屏,根本不知道哪...
问题详情见图片中的注释,谢谢高手
后来发现是另外一个地方导致的。
问题来了:用XCode调试吧,一旦代码出错,既不返回错误信息,也不定位到错误行,只是黑屏、黑屏,根本不知道哪儿出错了。。。
怎么办呢? 展开
后来发现是另外一个地方导致的。
问题来了:用XCode调试吧,一旦代码出错,既不返回错误信息,也不定位到错误行,只是黑屏、黑屏,根本不知道哪儿出错了。。。
怎么办呢? 展开
1个回答
展开全部
您好,原因是这样的
您所使用的[NSArray arrayWithObjects:nil]是一个类方法,如果您进入它的注释说明您就能看到这个方法的返回值是一个id类型,这就是为什么您可以用一个类定义的对象去接受还能执行的原因
在OC中,id类型可以代表任何类型,但是之前使用的是数组的类方法,也就是说,只要这个类方法里面只要包含元素,系统就会认为这是一个数组类型的变量,您用自定义的类的对象去接收一个数组类型的地址,当然会引起指针错误并且不能为您执行了
为什么单有一个nil可以执行而系统不报错呢?因为OC是一门弱类型的语言,顾名思义,就是OC不会太在乎类和类之间的界限,这样尽管方便了编译,但是却不好查找错误。所以——当您使用只有一个nil的数组时,系统会把这个数组认定为一个空的对象,而您的receipes类中也没有定义任何数据,所以同为nil,系统当然可以将这行代码执行下去了。
但是我非常不建议您这样使用,如果您学了手动内存管理后您就会知道,当您使用了这个类方法之后,尽管操作是毫无意义并且看上去人畜无害的,但是系统却会为您的这行代码而给recipe对象增加一个计数器(retain count),也就是说recipe您创建的时候内存计数器为1,而您使用这行代码之后计数器就为2了。如果您不注意并且只在程序结束时只release了一次,那么这会引起非常严重的后果——您可能会遇到内存泄露的问题。并且recipe无法被完全释放
您所使用的[NSArray arrayWithObjects:nil]是一个类方法,如果您进入它的注释说明您就能看到这个方法的返回值是一个id类型,这就是为什么您可以用一个类定义的对象去接受还能执行的原因
在OC中,id类型可以代表任何类型,但是之前使用的是数组的类方法,也就是说,只要这个类方法里面只要包含元素,系统就会认为这是一个数组类型的变量,您用自定义的类的对象去接收一个数组类型的地址,当然会引起指针错误并且不能为您执行了
为什么单有一个nil可以执行而系统不报错呢?因为OC是一门弱类型的语言,顾名思义,就是OC不会太在乎类和类之间的界限,这样尽管方便了编译,但是却不好查找错误。所以——当您使用只有一个nil的数组时,系统会把这个数组认定为一个空的对象,而您的receipes类中也没有定义任何数据,所以同为nil,系统当然可以将这行代码执行下去了。
但是我非常不建议您这样使用,如果您学了手动内存管理后您就会知道,当您使用了这个类方法之后,尽管操作是毫无意义并且看上去人畜无害的,但是系统却会为您的这行代码而给recipe对象增加一个计数器(retain count),也就是说recipe您创建的时候内存计数器为1,而您使用这行代码之后计数器就为2了。如果您不注意并且只在程序结束时只release了一次,那么这会引起非常严重的后果——您可能会遇到内存泄露的问题。并且recipe无法被完全释放
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询