- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于下面的代码。。。
1)当我在主程序中调用*sumFrac
时,[result release]
是否在函数中被释放?
2)当我试图用[fractionArray release]
释放分数数组对象时,为什么会收到编译器错误?
3)最后,函数实际上不返回和,而是返回0/0
。为什么会这样?
很抱歉,如果这是显而易见的,那对我来说是新的。。。谢谢你
#import <Foundation/Foundation.h>
#import <Fraction.h>
Fraction * arraySum (Fraction *fracArray[], int arrayLength)
{
Fraction *sumFrac = [[Fraction alloc] init];
Fraction **fractsPtr;
for ( fractsPtr = fracArray; fractsPtr < arrayLength; ++fractsPtr )
sumFrac = [*fractsPtr add: *(fractsPtr + 1)];
return sumFrac;
}
//Test function
int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Fraction *result;
Fraction *a = [[Fraction alloc] initWith: 3 over: 5];
Fraction *b = [[Fraction alloc] initWith: 2 over: 7];
Fraction *c = [[Fraction alloc] initWith: 6 over: 3];
Fraction *fractionArray[] = { a, b, c };
result = arraySum ( fractionArray, 2 );
[result print];
[result release];
[a release];
[b release];
[c release];
[fractionArray release];
[pool drain];
return 0;
}
最佳答案
1)当我在主程序中调用[result release]时,位于函数中的*sumFrac是否被释放?
这是个有点诡计的问题。sumFrac
本身只是指向对象的指针。当你复制一个指针时,不管是通过直接赋值,还是通过=
,作为参数传递,从函数返回等等-这只是复制一个指针。因此,result
是指向与sumFrac
相同对象的指针。所以,当你发送一个release
时,它就像发送一个发布到sumFrac
一样。
(如果您使用的是ARC,这实际上会变得更加复杂,因为仅仅复制指针有时会自动执行refcount操作。但只要使用正确的名称或属性,它也会成为编译器的问题,而不是您的问题。)
但是,您会重复为sumFrac
指定一个新值。每次执行此操作时,它都停止指向旧值。旧值不release
s,新值不retain
s。因此,您返回的值sumFrac
确实会被释放,但是,除非arrayLength
是0,否则这与您在第一行中分配的值不同。我甚至不知道为什么要分配一个Fraction
对象,而只是为了另一个而忽略它,但是如果你想让它工作,你可以:
for ( fractsPtr = fracArray; fractsPtr < arrayLength; ++fractsPtr )
[sumFrac release];
sumFrac = [[*fractsPtr add: *(fractsPtr + 1)] retain];
sumFrac
时,首先释放旧对象并保留新对象,因此每个
Fraction
都以相同数量的ref结束(包括具有0个ref的无用新对象),但返回的对象有一个额外的ref,稍后在主函数中
release
。(这里我假设
-[add:]
返回一个新的、自动释放的
Fraction
。如果它改为就地修改对象,或者返回一个新的+1
Fraction
,或者其他内容,那就另当别论了。)
fractionArray
是一个
Fraction*[]
-也就是一个C风格的
Fraction
对象数组,而不是一个
Fraction
对象。不能将消息发送到C样式数组,只能发送到对象。
frac.m:61:6: warning: receiver type 'Fraction **' is not 'id' or interface pointer,
consider casting it to 'id'
[fractionArray release];
id
是一种表示“指向任何ObjC对象的指针”的类型,并且指向对象指针的指针与指向对象的指针不是一回事,所以这可能还不够。但是如果你发布了错误信息而不是仅仅说“我有编译器错误”,你会得到一个即时的答案。
release
发送到数组中的每个
Fraction
对象。你已经在用
[a release]
等做了。你根本不需要对数组做任何事情,因为它是在堆栈上分配的(如果你已经用
malloc
分配了它,你会想
free
它,而不是
release
它。)所以,你已经完成了。
NSArray *fractionArray = [NSArray arrayWithObjects: a, b, c, nil];
// ...
[fractionArray release];
release
它,因为
arrayWithObjects:
返回一个自动释放的数组,并且您有一个自动释放池,所以不要妨碍池的运行。)
for ( fractsPtr = fracArray; fractsPtr < arrayLength; ++fractsPtr )
fractsPtr < arrayLength
。这将把两者转换成可比较的类型,然后进行比较。
fractsPtr
是指向堆栈上数组的指针,因此它显然不小于2。您需要执行以下操作之一:
for ( fractsPtr = fracArray; fractsPtr < fracArray+arrayLength; ++fractsPtr )
for (i = 0; i < arrayLength; ++i) {
fractsPtr = fracArray[i];
frac.m:34:44: warning: ordered comparison between pointer and integer
('Fraction **' and 'int')
for ( fractsPtr = fracArray; fractsPtr < arrayLength; ++fractsPtr )
add:
可能在做什么,等等。即使警告没有向你解释问题,至少在你的问题中提到它。
sumFracs
赋值给
[*fractsPtr add: *(fractsPtr+1)];
只有最后一个赋值才重要。所以,它仍然不会求所有分数的和,只是最后两个,换句话说,它将和
[fracArray[arrayLength-1] add:fracArray[arrayLength]]
一样。
arrayLength
的参数,而它实际上意味着小于数组长度1,则是一种灾难邀请。您知道调用
arraySum(fractionArray, 2)
是因为您刚刚编写了代码,但是当您在几周后返回到它时,您将编写
arraySum(fractionArray, 3)
(或
arraySum(fractionArray, sizeof(fractionArray)/sizeof(*fractionArray))
),它看起来非常正确,以至于您不知道为什么要读取垃圾值或分段。
关于objective-c - 返回数组中* Fraction对象之和的函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15693592/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!